Unverified Commit 7f605b94 authored by Felipe Santos's avatar Felipe Santos Committed by GitHub

Fix several issues with docker-outside-of-docker (#443)

* Fix several issues with docker-outside-of-docker

* Add initial tests and bump version

* Add two tests

* Fix docker buildx conflict

* Fix possible test issue

* Add tests for moby

* Add buildx test to init

* Fix inconsistency

* Many fixes and improvements

* Make dockeDashCompose v2 by default
parent f0dd470b
{ {
"id": "docker-outside-of-docker", "id": "docker-outside-of-docker",
"version": "1.1.0", "version": "1.2.0",
"name": "Docker (docker-outside-of-docker)", "name": "Docker (docker-outside-of-docker)",
"documentationURL": "https://github.com/devcontainers/features/tree/main/src/docker-outside-of-docker", "documentationURL": "https://github.com/devcontainers/features/tree/main/src/docker-outside-of-docker",
"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.", "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.",
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
"v1", "v1",
"v2" "v2"
], ],
"default": "v1", "default": "v2",
"description": "Compose version to use for docker-compose (v1 or v2)" "description": "Compose version to use for docker-compose (v1 or v2)"
}, },
"installDockerBuildx": { "installDockerBuildx": {
...@@ -36,9 +36,6 @@ ...@@ -36,9 +36,6 @@
} }
}, },
"entrypoint": "/usr/local/share/docker-init.sh", "entrypoint": "/usr/local/share/docker-init.sh",
"containerEnv": {
"DOCKER_BUILDKIT": "1"
},
"customizations": { "customizations": {
"vscode": { "vscode": {
"extensions": [ "extensions": [
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
DOCKER_VERSION="${VERSION:-"latest"}" DOCKER_VERSION="${VERSION:-"latest"}"
USE_MOBY="${MOBY:-"true"}" USE_MOBY="${MOBY:-"true"}"
DOCKER_DASH_COMPOSE_VERSION="${DOCKERDASHCOMPOSEVERSION:-"v1"}" # v1 or v2 DOCKER_DASH_COMPOSE_VERSION="${DOCKERDASHCOMPOSEVERSION:-"v2"}" # v1 or v2
ENABLE_NONROOT_DOCKER="${ENABLE_NONROOT_DOCKER:-"true"}" ENABLE_NONROOT_DOCKER="${ENABLE_NONROOT_DOCKER:-"true"}"
SOURCE_SOCKET="${SOURCE_SOCKET:-"/var/run/docker-host.sock"}" SOURCE_SOCKET="${SOURCE_SOCKET:-"/var/run/docker-host.sock"}"
...@@ -194,17 +194,32 @@ if type docker > /dev/null 2>&1; then ...@@ -194,17 +194,32 @@ if type docker > /dev/null 2>&1; then
echo "Docker / Moby CLI already installed." echo "Docker / Moby CLI already installed."
else else
if [ "${USE_MOBY}" = "true" ]; then if [ "${USE_MOBY}" = "true" ]; then
apt-get -y install --no-install-recommends moby-cli${cli_version_suffix} moby-buildx buildx=()
if [ "${INSTALL_DOCKER_BUILDX}" = "true" ]; then
buildx=(moby-buildx)
fi
apt-get -y install --no-install-recommends ${cli_package_name}${cli_version_suffix} "${buildx[@]}"
apt-get -y install --no-install-recommends moby-compose || echo "(*) Package moby-compose (Docker Compose v2) not available for OS ${ID} ${VERSION_CODENAME} (${architecture}). Skipping." apt-get -y install --no-install-recommends moby-compose || echo "(*) Package moby-compose (Docker Compose v2) not available for OS ${ID} ${VERSION_CODENAME} (${architecture}). Skipping."
else else
apt-get -y install --no-install-recommends docker-ce-cli${cli_version_suffix} buildx=()
if [ "${INSTALL_DOCKER_BUILDX}" = "true" ]; then
buildx=(docker-buildx-plugin)
fi
apt-get -y install --no-install-recommends ${cli_package_name}${cli_version_suffix} "${buildx[@]}" docker-compose-plugin
buildx_path="/usr/libexec/docker/cli-plugins/docker-buildx"
# Older versions of Docker CE installs buildx as part of the CLI package
if [ "${INSTALL_DOCKER_BUILDX}" = "false" ] && [ -f "${buildx_path}" ]; then
echo "(*) Removing docker-buildx installed from docker-ce-cli since installDockerBuildx is disabled..."
rm -f "${buildx_path}"
fi
fi fi
unset buildx buildx_path
fi fi
# Install Docker Compose if not already installed and is on a supported architecture # Install Docker Compose if not already installed and is on a supported architecture
if type docker-compose > /dev/null 2>&1; then if type docker-compose > /dev/null 2>&1; then
echo "Docker Compose already installed." echo "Docker Compose already installed."
else elif [ "${DOCKER_DASH_COMPOSE_VERSION}" = "v1" ]; then
TARGET_COMPOSE_ARCH="$(uname -m)" TARGET_COMPOSE_ARCH="$(uname -m)"
if [ "${TARGET_COMPOSE_ARCH}" = "amd64" ]; then if [ "${TARGET_COMPOSE_ARCH}" = "amd64" ]; then
TARGET_COMPOSE_ARCH="x86_64" TARGET_COMPOSE_ARCH="x86_64"
...@@ -231,53 +246,29 @@ else ...@@ -231,53 +246,29 @@ else
curl -fsSL "https://github.com/docker/compose/releases/download/${compose_v1_version}/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose curl -fsSL "https://github.com/docker/compose/releases/download/${compose_v1_version}/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
fi fi
fi else
echo "(*) Installing compose-switch as docker-compose..."
# Install docker-compose switch if not already installed - https://github.com/docker/compose-switch#manual-installation
current_v1_compose_path="$(which docker-compose)"
target_v1_compose_path="$(dirname "${current_v1_compose_path}")/docker-compose-v1"
if ! type compose-switch > /dev/null 2>&1; then
echo "(*) Installing compose-switch..."
compose_switch_version="latest" compose_switch_version="latest"
find_version_from_git_tags compose_switch_version "https://github.com/docker/compose-switch" find_version_from_git_tags compose_switch_version "https://github.com/docker/compose-switch"
curl -fsSL "https://github.com/docker/compose-switch/releases/download/v${compose_switch_version}/docker-compose-linux-${architecture}" -o /usr/local/bin/compose-switch curl -fsSL "https://github.com/docker/compose-switch/releases/download/v${compose_switch_version}/docker-compose-linux-${architecture}" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/compose-switch chmod +x /usr/local/bin/docker-compose
# TODO: Verify checksum once available: https://github.com/docker/compose-switch/issues/11 # TODO: Verify checksum once available: https://github.com/docker/compose-switch/issues/11
# Setup v1 CLI as alternative in addition to compose-switch (which maps to v2)
mv "${current_v1_compose_path}" "${target_v1_compose_path}"
update-alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/compose-switch 99
update-alternatives --install /usr/local/bin/docker-compose docker-compose "${target_v1_compose_path}" 1
fi
if [ "${DOCKER_DASH_COMPOSE_VERSION}" = "v1" ]; then
update-alternatives --set docker-compose "${target_v1_compose_path}"
else
update-alternatives --set docker-compose /usr/local/bin/compose-switch
fi fi
# Setup a docker group in the event the docker socket's group is not root # Setup a docker group in the event the docker socket's group is not root
if ! grep -qE '^docker:' /etc/group; then if ! grep -qE '^docker:' /etc/group; then
echo "(*) Creating missing docker group..."
groupadd --system docker groupadd --system docker
fi fi
usermod -aG docker "${USERNAME}"
if [ "${INSTALL_DOCKER_BUILDX}" = "true" ]; then
buildx_version="latest"
find_version_from_git_tags buildx_version "https://github.com/docker/buildx" "refs/tags/v"
echo "(*) Installing buildx ${buildx_version}..." # Ensure docker group gid is 999
buildx_file_name="buildx-v${buildx_version}.linux-${architecture}" if [ "$(getent group docker | cut -d: -f3)" != "999" ]; then
cd /tmp && wget "https://github.com/docker/buildx/releases/download/v${buildx_version}/${buildx_file_name}" echo "(*) Updating docker group gid to 999..."
groupmod -g 999 docker
mkdir -p ${_REMOTE_USER_HOME}/.docker/cli-plugins
mv ${buildx_file_name} ${_REMOTE_USER_HOME}/.docker/cli-plugins/docker-buildx
chmod +x ${_REMOTE_USER_HOME}/.docker/cli-plugins/docker-buildx
chown -R "${USERNAME}:docker" "${_REMOTE_USER_HOME}/.docker"
chmod -R g+r+w "${_REMOTE_USER_HOME}/.docker"
find "${_REMOTE_USER_HOME}/.docker" -type d -print0 | xargs -n 1 -0 chmod g+s
fi fi
usermod -aG docker "${USERNAME}"
# If init file already exists, exit # If init file already exists, exit
if [ -f "/usr/local/share/docker-init.sh" ]; then if [ -f "/usr/local/share/docker-init.sh" ]; then
# Clean up # Clean up
......
./docker_build.sh
\ No newline at end of file
...@@ -6,7 +6,7 @@ set -e ...@@ -6,7 +6,7 @@ set -e
source dev-container-features-test-lib source dev-container-features-test-lib
# Definition specific tests # Definition specific tests
check "docker-buildx" docker buildx version check "no buildx" bash -c "docker buildx version 2>&1 | grep 'not a docker command'"
check "docker-build" docker build ./ check "docker-build" docker build ./
# Report result # Report result
......
./docker_build_no_buildx.sh
\ No newline at end of file
...@@ -6,8 +6,8 @@ set -e ...@@ -6,8 +6,8 @@ set -e
source dev-container-features-test-lib source dev-container-features-test-lib
# Definition specific tests # Definition specific tests
check "docker-buildx" docker buildx version check "docker compose" bash -c "docker compose version | grep -E '2.[0-9]+.[0-9]+'"
check "docker-build" docker build ./ check "docker-compose" bash -c "docker-compose --version | grep -E '1.[0-9]+.[0-9]+'"
# Report result # Report result
reportResults reportResults
./docker_dash_compose_v1.sh
\ No newline at end of file
#!/bin/bash
set -e
# Optional: Import test library
source dev-container-features-test-lib
# Definition specific tests
check "docker compose" bash -c "docker compose version | grep -E '2.[0-9]+.[0-9]+'"
check "docker-compose" bash -c "docker-compose --version | grep -E '2.[0-9]+.[0-9]+'"
# Report result
reportResults
./docker_dash_compose_v2.sh
\ No newline at end of file
...@@ -5,11 +5,15 @@ set -e ...@@ -5,11 +5,15 @@ set -e
# Optional: Import test library # Optional: Import test library
source dev-container-features-test-lib source dev-container-features-test-lib
check "docker buildx" bash -c "docker buildx version"
check "docker compose" bash -c "docker compose version"
check "docker-compose" bash -c "docker-compose --version"
check "docker-init-exists" bash -c "ls /usr/local/share/docker-init.sh" check "docker-init-exists" bash -c "ls /usr/local/share/docker-init.sh"
check "log-exists" bash -c "ls /tmp/vscr-docker-from-docker.log" check "log-exists" bash -c "ls /tmp/vscr-docker-from-docker.log"
check "log-contents-for-success" bash -c "cat /tmp/vscr-docker-from-docker.log | grep 'Success'" check "log-contents-for-success" bash -c "cat /tmp/vscr-docker-from-docker.log | grep 'Success'"
check "log-contents" bash -c "cat /tmp/vscr-docker-from-docker.log | grep 'Proxying /var/run/docker-host.sock to /var/run/docker.sock for vscode'" check "log-contents" bash -c "cat /tmp/vscr-docker-from-docker.log | grep 'Proxying /var/run/docker-host.sock to /var/run/docker.sock for vscode'"
check "docker-ps" bash -c "docker ps" check "docker-ps" bash -c "docker ps >/dev/null"
# Report result # Report result
reportResults reportResults
\ No newline at end of file
./docker_init.sh
\ No newline at end of file
./docker_init.sh
\ No newline at end of file
./docker_init.sh
\ No newline at end of file
{ {
"docker_init_moby": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": {
"docker-outside-of-docker": {
"moby": true
}
},
"containerUser": "vscode"
},
"docker_init": { "docker_init": {
"image": "mcr.microsoft.com/devcontainers/base", "image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"remoteUser": "vscode",
"features": { "features": {
"docker-outside-of-docker": { "docker-outside-of-docker": {
"version": "latest" "moby": false
} }
},
"containerUser": "vscode"
},
"docker_init_ubuntu_22": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-22.04",
"features": {
"docker-outside-of-docker": {
"moby": false
}
},
"containerUser": "vscode"
},
"docker_init_debian": {
"image": "mcr.microsoft.com/devcontainers/base:debian",
"features": {
"docker-outside-of-docker": {
"moby": false
} }
}, },
"containerUser": "vscode"
},
"docker_build": { "docker_build": {
"image": "mcr.microsoft.com/devcontainers/javascript-node:0-18", "image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": { "features": {
"docker-outside-of-docker": { "docker-outside-of-docker": {
"version": "latest", "moby": false,
"installDockerBuildx": true,
"moby": "false",
"dockerDashComposeVersion": "v2" "dockerDashComposeVersion": "v2"
} }
}, },
"remoteUser": "node" "containerUser": "vscode"
}, },
"docker_build_2": { "docker_build_moby": {
"image": "ubuntu:focal", "image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": { "features": {
"docker-outside-of-docker": { "docker-outside-of-docker": {
"version": "latest", "moby": true
"moby": "false",
"dockerDashComposeVersion": "v2"
} }
},
"containerUser": "vscode"
},
"docker_build_no_buildx": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": {
"docker-outside-of-docker": {
"version": "20",
"moby": false,
"installDockerBuildx": false
} }
}, },
"docker_build_older": { "containerUser": "vscode"
"image": "mcr.microsoft.com/devcontainers/javascript-node:0-18", },
"docker_build_no_buildx_moby": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": { "features": {
"docker-outside-of-docker": { "docker-outside-of-docker": {
"version": "20", "version": "20",
"moby": "false", "moby": true,
"installDockerBuildx": false
}
},
"containerUser": "vscode"
},
"docker_dash_compose_v1": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": {
"docker-outside-of-docker": {
"moby": false,
"dockerDashComposeVersion": "v1"
}
},
"containerUser": "vscode"
},
"docker_dash_compose_v1_moby": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": {
"docker-outside-of-docker": {
"moby": true,
"dockerDashComposeVersion": "v1"
}
},
"containerUser": "vscode"
},
"docker_dash_compose_v2": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": {
"docker-outside-of-docker": {
"moby": false,
"dockerDashComposeVersion": "v2"
}
},
"containerUser": "vscode"
},
"docker_dash_compose_v2_moby": {
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-20.04",
"features": {
"docker-outside-of-docker": {
"moby": true,
"dockerDashComposeVersion": "v2" "dockerDashComposeVersion": "v2"
} }
}, },
"remoteUser": "node" "containerUser": "vscode"
} }
} }
...@@ -5,10 +5,11 @@ set -e ...@@ -5,10 +5,11 @@ set -e
# Optional: Import test library # Optional: Import test library
source dev-container-features-test-lib source dev-container-features-test-lib
# Definition specific tests check "docker buildx" bash -c "docker buildx version"
check "version" docker --version check "docker compose" bash -c "docker compose version"
check "docker-init-exists" bash -c "ls /usr/local/share/docker-init.sh" check "docker-compose" bash -c "docker-compose --version"
check "docker-ps" bash -c "docker ps"
check "docker-ps" bash -c "docker ps >/dev/null"
# Report result # Report result
reportResults reportResults
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment