From f063f4ea83787b34d7c6e97c48b9c84c758a5bcd Mon Sep 17 00:00:00 2001 From: Ben Menesini Date: Fri, 9 Feb 2024 15:51:47 -0800 Subject: [PATCH 1/5] Allow moby-buildx version to be specified in devcontainer.json Fixes #837 --- src/docker-in-docker/README.md | 1 + src/docker-in-docker/install.sh | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/docker-in-docker/README.md b/src/docker-in-docker/README.md index bfca77357..83fd812ed 100644 --- a/src/docker-in-docker/README.md +++ b/src/docker-in-docker/README.md @@ -17,6 +17,7 @@ Create child containers *inside* a container, independent from the host's docker |-----|-----|-----|-----| | version | Select or enter a Docker/Moby Engine version. (Availability can vary by OS version.) | string | latest | | moby | Install OSS Moby build instead of Docker CE | boolean | true | +| mobyBuildxVersion | Select or enter a Moby Buildx version. (Availability can vary by OS version.) | string | latest | | dockerDashComposeVersion | Default version of Docker Compose (v1 or v2 or none) | string | v1 | | azureDnsAutoDetection | Allow automatically setting the dockerd DNS server when the installation script detects it is running in Azure | boolean | true | | dockerDefaultAddressPool | Define default address pools for Docker networks. e.g. base=192.168.0.0/16,size=24 | string | - | diff --git a/src/docker-in-docker/install.sh b/src/docker-in-docker/install.sh index 8543b65dd..11c8e36d5 100755 --- a/src/docker-in-docker/install.sh +++ b/src/docker-in-docker/install.sh @@ -10,6 +10,7 @@ DOCKER_VERSION="${VERSION:-"latest"}" # The Docker/Moby Engine + CLI should match in version USE_MOBY="${MOBY:-"true"}" +MOBY_BUILDX_VERSION="${MOBYBUILDXVERSION:-"latest"}" DOCKER_DASH_COMPOSE_VERSION="${DOCKERDASHCOMPOSEVERSION:-"v1"}" # v1 or v2 or none AZURE_DNS_AUTO_DETECTION="${AZUREDNSAUTODETECTION:-"true"}" DOCKER_DEFAULT_ADDRESS_POOL="${DOCKERDEFAULTADDRESSPOOL}" @@ -81,7 +82,7 @@ find_version_from_git_tags() { local repository=$2 local prefix=${3:-"tags/v"} local separator=${4:-"."} - local last_part_optional=${5:-"false"} + local last_part_optional=${5:-"false"} if [ "$(echo "${requested_version}" | grep -o "." | wc -l)" != "2" ]; then local escaped_separator=${separator//./\\.} local last_part @@ -198,6 +199,15 @@ else echo "cli_version_suffix ${cli_version_suffix}" fi +# Buildx version matching +if [ "${MOBY_BUILDX_VERSION}" = "latest" ]; then + # Empty, meaning grab whatever "latest" is in apt repo + buildx_version_suffix="" +else + buildx_version_suffix="=${MOBY_BUILDX_VERSION}" + echo "buildx_version_suffix ${buildx_version_suffix}" +fi + # Install Docker / Moby CLI if not already installed if type docker > /dev/null 2>&1 && type dockerd > /dev/null 2>&1; then echo "Docker / Moby CLI and Engine already installed." @@ -205,7 +215,7 @@ else if [ "${USE_MOBY}" = "true" ]; then # Install engine set +e # Handle error gracefully - apt-get -y install --no-install-recommends moby-cli${cli_version_suffix} moby-buildx moby-engine${engine_version_suffix} + apt-get -y install --no-install-recommends moby-cli${cli_version_suffix} moby-buildx${buildx_version_suffix} moby-engine${engine_version_suffix} if [ $? -ne 0 ]; then err "Packages for moby not available in OS ${ID} ${VERSION_CODENAME} (${architecture}). To resolve, either: (1) set feature option '\"moby\": false' , or (2) choose a compatible OS version (eg: 'ubuntu-20.04')." exit 1 @@ -399,7 +409,7 @@ dockerd_start="AZURE_DNS_AUTO_DETECTION=${AZURE_DNS_AUTO_DETECTION} DOCKER_DEFAU retry_cgroup_nesting=`expr $retry_cgroup_nesting + 1` set -e - done + done # -- End: dind wrapper script -- @@ -442,7 +452,7 @@ retry_docker_start_count=0 docker_ok="false" until [ "${docker_ok}" = "true" ] || [ "${retry_docker_start_count}" -eq "5" ]; -do +do # Start using sudo if not invoked as root if [ "$(id -u)" -ne 0 ]; then sudo /bin/sh -c "${dockerd_start}" @@ -460,7 +470,7 @@ do retry_count=`expr $retry_count + 1` done - + if [ "${docker_ok}" != "true" ] && [ "${retry_docker_start_count}" != "4" ]; then echo "(*) Failed to start docker, retrying..." set +e @@ -468,7 +478,7 @@ do sudo_if pkill containerd set -e fi - + retry_docker_start_count=`expr $retry_docker_start_count + 1` done From b715b4717230edf905cdcd5627c1be1803038ea9 Mon Sep 17 00:00:00 2001 From: Ben Menesini Date: Fri, 9 Feb 2024 16:01:30 -0800 Subject: [PATCH 2/5] Revert changes to README.md --- src/docker-in-docker/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/docker-in-docker/README.md b/src/docker-in-docker/README.md index 83fd812ed..bfca77357 100644 --- a/src/docker-in-docker/README.md +++ b/src/docker-in-docker/README.md @@ -17,7 +17,6 @@ Create child containers *inside* a container, independent from the host's docker |-----|-----|-----|-----| | version | Select or enter a Docker/Moby Engine version. (Availability can vary by OS version.) | string | latest | | moby | Install OSS Moby build instead of Docker CE | boolean | true | -| mobyBuildxVersion | Select or enter a Moby Buildx version. (Availability can vary by OS version.) | string | latest | | dockerDashComposeVersion | Default version of Docker Compose (v1 or v2 or none) | string | v1 | | azureDnsAutoDetection | Allow automatically setting the dockerd DNS server when the installation script detects it is running in Azure | boolean | true | | dockerDefaultAddressPool | Define default address pools for Docker networks. e.g. base=192.168.0.0/16,size=24 | string | - | From 4ebad36f6fdccd8e51fdd9149a8feb1fcb8d0d21 Mon Sep 17 00:00:00 2001 From: Ben Menesini Date: Fri, 9 Feb 2024 16:09:34 -0800 Subject: [PATCH 3/5] Address code review feedback - Specify mobyBuildxVersion in devcontainer-feature.json with pinned and commented default value - Bump minor version - Leverage default value in install.sh - Only set buildx_version_suffix when installing moby --- .../devcontainer-feature.json | 7 ++++++- src/docker-in-docker/install.sh | 20 +++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/docker-in-docker/devcontainer-feature.json b/src/docker-in-docker/devcontainer-feature.json index 6b5c9840c..53d153f97 100644 --- a/src/docker-in-docker/devcontainer-feature.json +++ b/src/docker-in-docker/devcontainer-feature.json @@ -1,6 +1,6 @@ { "id": "docker-in-docker", - "version": "2.8.1", + "version": "2.9.0", "name": "Docker (Docker-in-Docker)", "documentationURL": "https://github.com/devcontainers/features/tree/main/src/docker-in-docker", "description": "Create child containers *inside* a container, independent from the host's docker instance. Installs Docker extension in the container along with needed CLIs.", @@ -20,6 +20,11 @@ "default": true, "description": "Install OSS Moby build instead of Docker CE" }, + "mobyBuildxVersion": { + "type": "string", + "default": "0.12.0-ubuntu20.04u1", // 2024-02-09 Microsoft's Package Manifest has mismatching filesize and SHA for 0.12.1; default to last known good version + "description": "Install a specific version of moby-buildx when using Moby" + }, "dockerDashComposeVersion": { "type": "string", "enum": [ diff --git a/src/docker-in-docker/install.sh b/src/docker-in-docker/install.sh index 11c8e36d5..9e18563c1 100755 --- a/src/docker-in-docker/install.sh +++ b/src/docker-in-docker/install.sh @@ -10,7 +10,7 @@ DOCKER_VERSION="${VERSION:-"latest"}" # The Docker/Moby Engine + CLI should match in version USE_MOBY="${MOBY:-"true"}" -MOBY_BUILDX_VERSION="${MOBYBUILDXVERSION:-"latest"}" +MOBY_BUILDX_VERSION="${MOBYBUILDXVERSION}" DOCKER_DASH_COMPOSE_VERSION="${DOCKERDASHCOMPOSEVERSION:-"v1"}" # v1 or v2 or none AZURE_DNS_AUTO_DETECTION="${AZUREDNSAUTODETECTION:-"true"}" DOCKER_DEFAULT_ADDRESS_POOL="${DOCKERDEFAULTADDRESSPOOL}" @@ -199,20 +199,20 @@ else echo "cli_version_suffix ${cli_version_suffix}" fi -# Buildx version matching -if [ "${MOBY_BUILDX_VERSION}" = "latest" ]; then - # Empty, meaning grab whatever "latest" is in apt repo - buildx_version_suffix="" -else - buildx_version_suffix="=${MOBY_BUILDX_VERSION}" - echo "buildx_version_suffix ${buildx_version_suffix}" -fi - # Install Docker / Moby CLI if not already installed if type docker > /dev/null 2>&1 && type dockerd > /dev/null 2>&1; then echo "Docker / Moby CLI and Engine already installed." else if [ "${USE_MOBY}" = "true" ]; then + # Buildx version matching + if [ "${MOBY_BUILDX_VERSION}" = "latest" ]; then + # Empty, meaning grab whatever "latest" is in apt repo + buildx_version_suffix="" + else + buildx_version_suffix="=${MOBY_BUILDX_VERSION}" + echo "buildx_version_suffix ${buildx_version_suffix}" + fi + # Install engine set +e # Handle error gracefully apt-get -y install --no-install-recommends moby-cli${cli_version_suffix} moby-buildx${buildx_version_suffix} moby-engine${engine_version_suffix} From f64ce0ac8a1733c28e039628b029a624096de0e6 Mon Sep 17 00:00:00 2001 From: Ben Menesini Date: Fri, 9 Feb 2024 16:27:47 -0800 Subject: [PATCH 4/5] Handle varying distributions --- .../devcontainer-feature.json | 4 +-- src/docker-in-docker/install.sh | 31 +++++++++++++------ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/docker-in-docker/devcontainer-feature.json b/src/docker-in-docker/devcontainer-feature.json index 53d153f97..744bc1d81 100644 --- a/src/docker-in-docker/devcontainer-feature.json +++ b/src/docker-in-docker/devcontainer-feature.json @@ -22,8 +22,8 @@ }, "mobyBuildxVersion": { "type": "string", - "default": "0.12.0-ubuntu20.04u1", // 2024-02-09 Microsoft's Package Manifest has mismatching filesize and SHA for 0.12.1; default to last known good version - "description": "Install a specific version of moby-buildx when using Moby" + "default": "0.12.0", + "description": "Install a specific version of moby-buildx when using Moby. (2024-02-09: Microsoft's Package Manifest has mismatching filesize and SHA for 0.12.1; default is last known good version)" }, "dockerDashComposeVersion": { "type": "string", diff --git a/src/docker-in-docker/install.sh b/src/docker-in-docker/install.sh index 9e18563c1..1284813a8 100755 --- a/src/docker-in-docker/install.sh +++ b/src/docker-in-docker/install.sh @@ -199,20 +199,33 @@ else echo "cli_version_suffix ${cli_version_suffix}" fi +# Version matching for moby-buildx +if [ "${USE_MOBY}" = "true" ]; then + if [ "${MOBY_BUILDX_VERSION}" = "latest" ]; then + # Empty, meaning grab whatever "latest" is in apt repo + buildx_version_suffix="" + else + buildx_version_dot_escaped="${MOBY_BUILDX_VERSION//./\\.}" + buildx_version_dot_plus_escaped="${buildx_version_dot_escaped//+/\\+}" + buildx_version_regex="^(.+:)?${buildx_version_dot_plus_escaped}([\\.\\+ ~:-]|$)" + set +e + buildx_version_suffix="=$(apt-cache madison moby-buildx | awk -F"|" '{print $2}' | sed -e 's/^[ \t]*//' | grep -E -m 1 "${buildx_version_regex}")" + set -e + if [ -z "${buildx_version_suffix}" ] || [ "${buildx_version_suffix}" = "=" ]; then + err "No full or partial moby-buildx version match found for \"${MOBY_BUILDX_VERSION}\" on OS ${ID} ${VERSION_CODENAME} (${architecture}). Available versions:" + apt-cache madison moby-buildx | awk -F"|" '{print $2}' | grep -oP '^(.+:)?\K.+' + exit 1 + fi + buildx_version_suffix="=${MOBY_BUILDX_VERSION}" + echo "buildx_version_suffix ${buildx_version_suffix}" + fi +fi + # Install Docker / Moby CLI if not already installed if type docker > /dev/null 2>&1 && type dockerd > /dev/null 2>&1; then echo "Docker / Moby CLI and Engine already installed." else if [ "${USE_MOBY}" = "true" ]; then - # Buildx version matching - if [ "${MOBY_BUILDX_VERSION}" = "latest" ]; then - # Empty, meaning grab whatever "latest" is in apt repo - buildx_version_suffix="" - else - buildx_version_suffix="=${MOBY_BUILDX_VERSION}" - echo "buildx_version_suffix ${buildx_version_suffix}" - fi - # Install engine set +e # Handle error gracefully apt-get -y install --no-install-recommends moby-cli${cli_version_suffix} moby-buildx${buildx_version_suffix} moby-engine${engine_version_suffix} From 5c722202a26767371ed74ec8245c2a74053d24e9 Mon Sep 17 00:00:00 2001 From: Ben Menesini Date: Fri, 9 Feb 2024 16:36:05 -0800 Subject: [PATCH 5/5] Fix typo / remove extra line --- src/docker-in-docker/install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/src/docker-in-docker/install.sh b/src/docker-in-docker/install.sh index 1284813a8..db3cefc6a 100755 --- a/src/docker-in-docker/install.sh +++ b/src/docker-in-docker/install.sh @@ -216,7 +216,6 @@ if [ "${USE_MOBY}" = "true" ]; then apt-cache madison moby-buildx | awk -F"|" '{print $2}' | grep -oP '^(.+:)?\K.+' exit 1 fi - buildx_version_suffix="=${MOBY_BUILDX_VERSION}" echo "buildx_version_suffix ${buildx_version_suffix}" fi fi