Skip to content

Commit 174e67a

Browse files
committed
docker.yaml: add .param.Rootful
By passing the `--set .param.Rootful=true` option to `limactl {create,start,edit}`, Docker inside the VM will run in rootful mode. Signed-off-by: Norio Nomura <[email protected]>
1 parent 5267044 commit 174e67a

File tree

1 file changed

+49
-13
lines changed

1 file changed

+49
-13
lines changed

Diff for: examples/docker.yaml

+49-13
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,54 @@ provision:
4444
#!/bin/bash
4545
set -eux -o pipefail
4646
command -v docker >/dev/null 2>&1 && exit 0
47+
readonly override_conf=/etc/systemd/system/docker.socket.d/override.conf
48+
if [ ! -e "$override_conf" ]; then
49+
mkdir -p $(dirname "$override_conf")
50+
# Alternatively we could just add the user to the "docker" group, but that requires restarting the user session
51+
cat <<EOF >"$override_conf"
52+
[Socket]
53+
SocketUser={{.User}}
54+
EOF
55+
fi
4756
export DEBIAN_FRONTEND=noninteractive
4857
curl -fsSL https://get.docker.com | sh
49-
# NOTE: you may remove the lines below, if you prefer to use rootful docker, not rootless
50-
systemctl disable --now docker
51-
apt-get install -y dbus-user-session fuse3 jq uidmap
52-
- mode: user
58+
- mode: user # configure docker under non-root user
5359
script: |
5460
#!/bin/bash
5561
set -eux -o pipefail
56-
systemctl --user start dbus
57-
systemctl list-unit-files --user docker.service &>/dev/null || dockerd-rootless-setuptool.sh install
58-
docker context use rootless
62+
command -v jq &>/dev/null || sudo apt-get install -y jq
63+
readonly rootless_installed=$(systemctl --user list-unit-files docker.service &>/dev/null && echo true || echo false)
64+
65+
if [ "{{.Param.Rootful}}" = "true" ]; then
66+
readonly config_dir="/etc/docker"
67+
readonly systemctl="sudo systemctl"
68+
readonly tee="sudo tee"
69+
70+
[ "$rootless_installed" != "true" ] || systemctl --user disable --now docker
71+
docker context use default
72+
73+
else
74+
readonly config_dir="$HOME/.config/docker"
75+
readonly systemctl="systemctl --user"
76+
readonly tee="tee"
5977
60-
readonly config="$HOME/.config/docker/daemon.json"
78+
sudo systemctl disable --now docker.socket docker
79+
if [ "$rootless_installed" != "true" ]; then
80+
sudo apt-get install -y dbus-user-session fuse3 uidmap
81+
$systemctl start dbus
82+
dockerd-rootless-setuptool.sh install
83+
fi
84+
docker context use rootless
85+
fi
86+
$systemctl enable --now docker
87+
88+
readonly config="$config_dir/daemon.json"
6189
needs_restart=
6290
function set_docker_daemon_json() {
6391
function cat_config() { test -s "$config" && cat "$config" || echo "{}" ; }
6492
local -r current=$(cat_config | jq -r "$1 // empty")
6593
[ "$current" = "$2" ] && return 0
66-
mkdir -p $(dirname "$config") && cat_config | jq "$1 = ${2:-empty}" | (sleep 0 && tee "$config") && needs_restart=1
94+
mkdir -p "$config_dir" && cat_config | jq "$1 = ${2:-empty}" | (sleep 0 && $tee "$config") && needs_restart=1
6795
}
6896
6997
# enable containerd image store
@@ -72,7 +100,7 @@ provision:
72100
)"
73101
74102
# restart docker to apply the new configuration
75-
[ -z "$needs_restart" ] || systemctl --user restart docker
103+
[ -z "$needs_restart" ] || $systemctl restart docker
76104
probes:
77105
- script: |
78106
#!/bin/bash
@@ -81,8 +109,15 @@ probes:
81109
echo >&2 "docker is not installed yet"
82110
exit 1
83111
fi
84-
if ! timeout 30s bash -c "until pgrep rootlesskit; do sleep 3; done"; then
85-
echo >&2 "rootlesskit (used by rootless docker) is not running"
112+
if [ "{{.Param.Rootful}}" = "true" ]; then
113+
target=dockerd
114+
target_description="dockerd"
115+
else
116+
target=rootlesskit
117+
target_description="rootlesskit (used by rootless docker)"
118+
fi
119+
if ! timeout 30s bash -c "until pgrep $target; do sleep 3; done"; then
120+
echo >&2 "$target_description is not running"
86121
exit 1
87122
fi
88123
hint: See "/var/log/cloud-init-output.log" in the guest
@@ -92,7 +127,7 @@ hostResolver:
92127
hosts:
93128
host.docker.internal: host.lima.internal
94129
portForwards:
95-
- guestSocket: "/run/user/{{.UID}}/docker.sock"
130+
- guestSocket: "{{if eq .Param.Rootful \"true\"}}/var/run{{else}}/run/user/{{.UID}}{{end}}/docker.sock"
96131
hostSocket: "{{.Dir}}/sock/docker.sock"
97132
message: |
98133
To run `docker` on the host (assumes docker-cli is installed), run the following commands:
@@ -103,3 +138,4 @@ message: |
103138
------
104139
param:
105140
ContainerdImageStore: false
141+
Rootful: false

0 commit comments

Comments
 (0)