Skip to content

Commit de1e634

Browse files
Docker fix - BuildKit is enabled but the buildx component is missing or broken (#478)
* Docker fix - BuildKit is enabled but the buildx component is missing or broken * nit * fix test
1 parent fe44925 commit de1e634

File tree

14 files changed

+206
-19
lines changed

14 files changed

+206
-19
lines changed

src/docker-in-docker/devcontainer-feature.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"id": "docker-in-docker",
3-
"version": "2.0.1",
3+
"version": "2.1.0",
44
"name": "Docker (Docker-in-Docker)",
55
"documentationURL": "https://github.com/devcontainers/features/tree/main/src/docker-in-docker",
66
"description": "Create child containers *inside* a container, independent from the host's docker instance. Installs Docker extension in the container along with needed CLIs.",
@@ -39,6 +39,11 @@
3939
"default": "",
4040
"proposals": [],
4141
"description": "Define default address pools for Docker networks. e.g. base=192.168.0.0/16,size=24"
42+
},
43+
"installDockerBuildx": {
44+
"type": "boolean",
45+
"default": true,
46+
"description": "Install Docker Buildx"
4247
}
4348
},
4449
"entrypoint": "/usr/local/share/docker-init.sh",

src/docker-in-docker/install.sh

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@ USE_MOBY="${MOBY:-"true"}"
1313
DOCKER_DASH_COMPOSE_VERSION="${DOCKERDASHCOMPOSEVERSION:-"v1"}" # v1 or v2
1414
AZURE_DNS_AUTO_DETECTION="${AZUREDNSAUTODETECTION:-"true"}"
1515
DOCKER_DEFAULT_ADDRESS_POOL="${DOCKERDEFAULTADDRESSPOOL}"
16-
17-
ENABLE_NONROOT_DOCKER="${ENABLE_NONROOT_DOCKER:-"true"}"
1816
USERNAME="${USERNAME:-"${_REMOTE_USER:-"automatic"}"}"
19-
17+
INSTALL_DOCKER_BUILDX="${INSTALLDOCKERBUILDX:-"true"}"
2018
MICROSOFT_GPG_KEYS_URI="https://packages.microsoft.com/keys/microsoft.asc"
2119
DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES="buster bullseye bionic focal jammy"
2220
DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES="buster bullseye bionic focal hirsute impish jammy"
@@ -158,7 +156,7 @@ else
158156
fi
159157

160158
# Install dependencies
161-
check_packages apt-transport-https curl ca-certificates pigz iptables gnupg2 dirmngr
159+
check_packages apt-transport-https curl ca-certificates pigz iptables gnupg2 dirmngr wget
162160
if ! type git > /dev/null 2>&1; then
163161
check_packages git
164162
fi
@@ -307,13 +305,27 @@ if [ -f "/usr/local/share/docker-init.sh" ]; then
307305
fi
308306
echo "docker-init doesn't exist, adding..."
309307

310-
# Add user to the docker group
311-
if [ "${ENABLE_NONROOT_DOCKER}" = "true" ]; then
312-
if ! getent group docker > /dev/null 2>&1; then
313-
groupadd docker
314-
fi
308+
if ! cat /etc/group | grep -e "^docker:" > /dev/null 2>&1; then
309+
groupadd -r docker
310+
fi
311+
312+
usermod -aG docker ${USERNAME}
313+
314+
if [ "${INSTALL_DOCKER_BUILDX}" = "true" ]; then
315+
buildx_version="latest"
316+
find_version_from_git_tags buildx_version "https://github.com/docker/buildx" "refs/tags/v"
317+
318+
echo "(*) Installing buildx ${buildx_version}..."
319+
buildx_file_name="buildx-v${buildx_version}.linux-${architecture}"
320+
cd /tmp && wget "https://github.com/docker/buildx/releases/download/v${buildx_version}/${buildx_file_name}"
321+
322+
mkdir -p ${_REMOTE_USER_HOME}/.docker/cli-plugins
323+
mv ${buildx_file_name} ${_REMOTE_USER_HOME}/.docker/cli-plugins/docker-buildx
324+
chmod +x ${_REMOTE_USER_HOME}/.docker/cli-plugins/docker-buildx
315325

316-
usermod -aG docker ${USERNAME}
326+
chown -R "${USERNAME}:docker" "${_REMOTE_USER_HOME}/.docker"
327+
chmod -R g+r+w "${_REMOTE_USER_HOME}/.docker"
328+
find "${_REMOTE_USER_HOME}/.docker" -type d -print0 | xargs -n 1 -0 chmod g+s
317329
fi
318330

319331
tee /usr/local/share/docker-init.sh > /dev/null \

src/docker-outside-of-docker/devcontainer-feature.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"id": "docker-outside-of-docker",
3-
"version": "1.0.10",
3+
"version": "1.1.0",
44
"name": "Docker (docker-outside-of-docker)",
55
"documentationURL": "https://github.com/devcontainers/features/tree/main/src/docker-outside-of-docker",
66
"description": "Re-use the host docker socket, adding the Docker CLI to a container. Feature invokes a script to enable using a forwarded Docker socket within a container to run Docker commands.",
@@ -28,6 +28,11 @@
2828
],
2929
"default": "v1",
3030
"description": "Compose version to use for docker-compose (v1 or v2)"
31+
},
32+
"installDockerBuildx": {
33+
"type": "boolean",
34+
"default": true,
35+
"description": "Install Docker Buildx"
3136
}
3237
},
3338
"entrypoint": "/usr/local/share/docker-init.sh",

src/docker-outside-of-docker/install.sh

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ ENABLE_NONROOT_DOCKER="${ENABLE_NONROOT_DOCKER:-"true"}"
1515
SOURCE_SOCKET="${SOURCE_SOCKET:-"/var/run/docker-host.sock"}"
1616
TARGET_SOCKET="${TARGET_SOCKET:-"/var/run/docker.sock"}"
1717
USERNAME="${USERNAME:-"${_REMOTE_USER:-"automatic"}"}"
18+
INSTALL_DOCKER_BUILDX="${INSTALLDOCKERBUILDX:-"true"}"
1819

1920
MICROSOFT_GPG_KEYS_URI="https://packages.microsoft.com/keys/microsoft.asc"
2021
DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES="buster bullseye bionic focal jammy"
@@ -116,7 +117,7 @@ find_version_from_git_tags() {
116117
export DEBIAN_FRONTEND=noninteractive
117118

118119
# Install dependencies
119-
check_packages apt-transport-https curl ca-certificates gnupg2 dirmngr
120+
check_packages apt-transport-https curl ca-certificates gnupg2 dirmngr wget
120121
if ! type git > /dev/null 2>&1; then
121122
check_packages git
122123
fi
@@ -254,6 +255,29 @@ else
254255
update-alternatives --set docker-compose /usr/local/bin/compose-switch
255256
fi
256257

258+
# Setup a docker group in the event the docker socket's group is not root
259+
if ! grep -qE '^docker:' /etc/group; then
260+
groupadd --system docker
261+
fi
262+
usermod -aG docker "${USERNAME}"
263+
264+
if [ "${INSTALL_DOCKER_BUILDX}" = "true" ]; then
265+
buildx_version="latest"
266+
find_version_from_git_tags buildx_version "https://github.com/docker/buildx" "refs/tags/v"
267+
268+
echo "(*) Installing buildx ${buildx_version}..."
269+
buildx_file_name="buildx-v${buildx_version}.linux-${architecture}"
270+
cd /tmp && wget "https://github.com/docker/buildx/releases/download/v${buildx_version}/${buildx_file_name}"
271+
272+
mkdir -p ${_REMOTE_USER_HOME}/.docker/cli-plugins
273+
mv ${buildx_file_name} ${_REMOTE_USER_HOME}/.docker/cli-plugins/docker-buildx
274+
chmod +x ${_REMOTE_USER_HOME}/.docker/cli-plugins/docker-buildx
275+
276+
chown -R "${USERNAME}:docker" "${_REMOTE_USER_HOME}/.docker"
277+
chmod -R g+r+w "${_REMOTE_USER_HOME}/.docker"
278+
find "${_REMOTE_USER_HOME}/.docker" -type d -print0 | xargs -n 1 -0 chmod g+s
279+
fi
280+
257281
# If init file already exists, exit
258282
if [ -f "/usr/local/share/docker-init.sh" ]; then
259283
# Clean up
@@ -277,11 +301,6 @@ if [ "${ENABLE_NONROOT_DOCKER}" = "false" ] || [ "${USERNAME}" = "root" ]; then
277301
exit 0
278302
fi
279303

280-
# Setup a docker group in the event the docker socket's group is not root
281-
if ! grep -qE '^docker:' /etc/group; then
282-
groupadd --system docker
283-
fi
284-
usermod -aG docker "${USERNAME}"
285304
DOCKER_GID="$(grep -oP '^docker:x:\K[^:]+' /etc/group)"
286305

287306
# If enabling non-root access and specified user is found, setup socat and add script

test/docker-in-docker/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
FROM ubuntu:focal

test/docker-in-docker/docker_build.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
# Optional: Import test library
6+
source dev-container-features-test-lib
7+
8+
# Definition specific tests
9+
check "docker-buildx" docker buildx version
10+
check "docker-build" docker build ./
11+
12+
# Report result
13+
reportResults
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
# Optional: Import test library
6+
source dev-container-features-test-lib
7+
8+
# Definition specific tests
9+
check "docker-buildx" docker buildx version
10+
check "docker-build" docker build ./
11+
12+
# Report result
13+
reportResults
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
# Optional: Import test library
6+
source dev-container-features-test-lib
7+
8+
# Definition specific tests
9+
check "docker-buildx" docker buildx version
10+
check "docker-build" docker build ./
11+
12+
# Report result
13+
reportResults

test/docker-in-docker/scenarios.json

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,38 @@
2525
"azureDnsAutoDetection": false
2626
}
2727
}
28+
},
29+
"docker_build": {
30+
"image": "mcr.microsoft.com/devcontainers/javascript-node:0-18",
31+
"features": {
32+
"docker-in-docker": {
33+
"version": "latest",
34+
"moby": "false",
35+
"dockerDashComposeVersion": "v2"
36+
}
37+
},
38+
"remoteUser": "node"
39+
},
40+
"docker_build_2": {
41+
"image": "ubuntu:focal",
42+
"features": {
43+
"docker-in-docker": {
44+
"version": "latest",
45+
"installDockerBuildx": true,
46+
"moby": "false",
47+
"dockerDashComposeVersion": "v2"
48+
}
49+
}
50+
},
51+
"docker_build_older": {
52+
"image": "mcr.microsoft.com/devcontainers/javascript-node:0-18",
53+
"features": {
54+
"docker-in-docker": {
55+
"version": "20",
56+
"moby": "false",
57+
"dockerDashComposeVersion": "v2"
58+
}
59+
},
60+
"remoteUser": "node"
2861
}
29-
}
62+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
FROM ubuntu:jammy

0 commit comments

Comments
 (0)