@@ -44,16 +44,63 @@ provision:
44
44
#!/bin/bash
45
45
set -eux -o pipefail
46
46
command -v docker >/dev/null 2>&1 && exit 0
47
- if [ ! -e /etc/systemd/system/docker.socket.d/override.conf ]; then
48
- mkdir -p /etc/systemd/system/docker.socket.d
47
+ readonly override_conf=/etc/systemd/system/docker.socket.d/override.conf
48
+ if [ ! -e "$override_conf" ]; then
49
+ mkdir -p $(dirname "$override_conf")
49
50
# Alternatively we could just add the user to the "docker" group, but that requires restarting the user session
50
- cat <<- EOF >/etc/systemd/system/docker.socket.d/override.conf
51
- [Socket]
52
- SocketUser={{.User}}
51
+ cat <<EOF >"$override_conf"
52
+ [Socket]
53
+ SocketUser={{.User}}
53
54
EOF
54
55
fi
55
56
export DEBIAN_FRONTEND=noninteractive
56
57
curl -fsSL https://get.docker.com | sh
58
+ - mode : user # configure docker under non-root user
59
+ script : |
60
+ #!/bin/bash
61
+ set -eux -o pipefail
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"
77
+
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"
89
+ needs_restart=
90
+ function set_docker_daemon_json() {
91
+ function cat_config() { test -s "$config" && cat "$config" || echo "{}" ; }
92
+ local -r current=$(cat_config | jq -r "$1 // empty")
93
+ [ "$current" = "$2" ] && return 0
94
+ mkdir -p "$config_dir" && cat_config | jq "$1 = ${2:-empty}" | (sleep 0 && $tee "$config") && needs_restart=1
95
+ }
96
+
97
+ # enable containerd image store
98
+ set_docker_daemon_json '.features."containerd-snapshotter"' "$(
99
+ [ "{{.Param.ContainerdImageStore}}" = "true" ] && echo 'true'
100
+ )"
101
+
102
+ # restart docker to apply the new configuration
103
+ [ -z "$needs_restart" ] || $systemctl restart docker
57
104
probes :
58
105
- script : |
59
106
#!/bin/bash
@@ -62,8 +109,15 @@ probes:
62
109
echo >&2 "docker is not installed yet"
63
110
exit 1
64
111
fi
65
- if ! timeout 30s bash -c "until pgrep dockerd; do sleep 3; done"; then
66
- echo >&2 "dockerd 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"
67
121
exit 1
68
122
fi
69
123
hint : See "/var/log/cloud-init-output.log" in the guest
@@ -73,7 +127,7 @@ hostResolver:
73
127
hosts :
74
128
host.docker.internal : host.lima.internal
75
129
portForwards :
76
- - guestSocket : " /var/run/docker.sock"
130
+ - guestSocket : " {{if eq .Param.Rootful \" true \" }} /var/run{{else}}/run/user/{{.UID}}{{end}} /docker.sock"
77
131
hostSocket : " {{.Dir}}/sock/docker.sock"
78
132
message : |
79
133
To run `docker` on the host (assumes docker-cli is installed), run the following commands:
@@ -82,3 +136,6 @@ message: |
82
136
docker context use lima-{{.Name}}
83
137
docker run hello-world
84
138
------
139
+ param :
140
+ ContainerdImageStore : false
141
+ Rootful : true
0 commit comments