Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/docker-in-docker/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"id": "docker-in-docker",
"version": "2.12.4",
"version": "2.13.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.",
Expand Down
513 changes: 435 additions & 78 deletions src/docker-in-docker/install.sh

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions test/docker-in-docker/azure_linux.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/bin/bash
set -e

# Optional: Import test library
source dev-container-features-test-lib

# OS identification (optional, can fail gracefully)
check "azure os detection" bash -c "cat /etc/os-release | grep -i azure || echo 'Not Azure Linux, but test can continue'"

# Core Docker functionality
check "docker version" docker --version
check "docker daemon running" docker info

# Docker init script (if using docker-in-docker feature)
check "docker init script exists" test -f "/usr/local/share/docker-init.sh"

# Basic functionality test
check "docker container test" docker run --rm alpine echo "test successful"

# The main Azure Linux specific test - DNS flag should NOT be present
check "dns flag should not be present" test ! "$(ps -ax | grep -v grep | grep -E 'dockerd.+\-\-dns')"

# Report result
reportResults
113 changes: 113 additions & 0 deletions test/docker-in-docker/azure_linux_docker_ce.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#!/bin/bash

set -e

# Optional: Import test library
source dev-container-features-test-lib

echo "=== Azure Linux Docker CE Test ==="

echo "1. Verifying OS identification..."
cat /etc/os-release | grep -i azure

echo "2. Checking Docker installation..."
docker --version || {
echo "ERROR: Docker is not installed"
exit 1
}

echo "3. Checking if Docker binaries exist..."
which dockerd || echo "dockerd not in PATH"
ls -la /usr/bin/docker* || echo "No docker binaries in /usr/bin"
ls -la /usr/local/bin/docker* || echo "No docker binaries in /usr/local/bin"

echo "4. Checking Docker service files..."
ls -la /etc/systemd/system/docker* || echo "No systemd docker files"
ls -la /usr/lib/systemd/system/docker* || echo "No system docker service files"

echo "6. Checking Docker daemon status..."
if ! docker info >/dev/null 2>&1; then
echo "Docker daemon not running, starting it..."

# Check if docker-init script exists
if [ -f "/usr/local/share/docker-init.sh" ]; then
echo "Starting Docker using docker-init.sh..."

# Clear any existing log
rm -f /tmp/dockerd.log

# Start docker-init in background
nohup /usr/local/share/docker-init.sh > /tmp/docker-init.log 2>&1 &

# Wait for Docker to start with better debugging
echo "Waiting for Docker daemon to start..."
for i in {1..30}; do
if docker info >/dev/null 2>&1; then
echo "Docker daemon started successfully"
break
fi
echo "Waiting... ($i/30)"

# Show dockerd logs if available
if [ -f "/tmp/dockerd.log" ]; then
echo "--- Recent dockerd.log entries ---"
tail -5 /tmp/dockerd.log || echo "Could not read dockerd.log"
echo "--- End of dockerd.log ---"
fi

sleep 2
done

# Final check with detailed error reporting
if ! docker info >/dev/null 2>&1; then
echo "ERROR: Docker daemon failed to start after 60 seconds"
echo ""
echo "=== DEBUGGING INFORMATION ==="
echo ""
echo "1. Docker init log:"
cat /tmp/docker-init.log 2>/dev/null || echo "No docker-init.log found"
echo ""
echo "2. Docker daemon log:"
cat /tmp/dockerd.log 2>/dev/null || echo "No dockerd.log found"
echo ""
echo "3. Process list:"
ps aux | grep -E "(docker|containerd)" | grep -v grep || echo "No docker/containerd processes found"
echo ""
echo "4. Network interfaces:"
ip addr show || ifconfig || echo "Could not get network info"
echo ""
echo "5. Mount points:"
mount | grep -E "(docker|container)" || echo "No docker-related mounts"
echo ""
echo "6. SELinux status:"
if command -v getenforce >/dev/null 2>&1; then
getenforce || echo "SELinux command failed"
else
echo "SELinux tools not available"
fi
echo ""
echo "7. Available storage:"
df -h /var/lib/docker 2>/dev/null || df -h / || echo "Could not check storage"
echo ""
echo "8. System resources:"
free -h || echo "Could not check memory"
echo ""
echo "=== END DEBUGGING ==="
exit 1
fi
else
echo "ERROR: docker-init.sh not found at /usr/local/share/docker-init.sh"
ls -la /usr/local/share/ || echo "Could not list /usr/local/share/"
exit 1
fi
else
echo "Docker daemon is already running"
fi

echo "7. Testing basic Docker functionality..."
docker info | head -10

echo "8. Testing container execution..."
docker run --rm alpine echo "Basic container test successful"

echo "=== Docker CE test completed successfully ==="
35 changes: 35 additions & 0 deletions test/docker-in-docker/cbl_mariner.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/bin/bash
# Simple test script for cbl_mariner scenario (Moby = true)
# Run with: sudo bash script_cbl_mariner.sh

set -e

echo "=== Testing cbl_mariner scenario (Moby) ==="

# Set environment variables for the scenario
export VERSION="latest"
export MOBY="true"
export AZUREDNSAUTODETECTION="false"

# Source OS info
. /etc/os-release
echo "OS: $ID $VERSION_ID"

# Check package manager
if type tdnf > /dev/null 2>&1; then
echo "Using tdnf"
else
echo "ERROR: tdnf not found"
exit 1
fi

# Validate
if command -v docker > /dev/null 2>&1; then
docker --version
echo "SUCCESS: Docker installed"
else
echo "ERROR: Docker not installed"
exit 1
fi

echo "=== cbl_mariner test passed ==="
34 changes: 34 additions & 0 deletions test/docker-in-docker/cbl_mariner_docker_ce.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/bash
# test script for cbl_mariner_docker_ce scenario (Moby = false)

set -e

echo "=== Testing cbl_mariner_docker_ce scenario (Docker CE) ==="

# Set environment variables for the scenario
export VERSION="latest"
export MOBY="false"
export AZUREDNSAUTODETECTION="false"

# Source OS info
. /etc/os-release
echo "OS: $ID $VERSION_ID"

# Check package manager
if type tdnf > /dev/null 2>&1; then
echo "Using tdnf"
else
echo "ERROR: tdnf not found"
exit 1
fi

# Validate
if command -v docker > /dev/null 2>&1; then
docker --version
echo "SUCCESS: Docker installed"
else
echo "ERROR: Docker not installed"
exit 1
fi

echo "=== cbl_mariner_docker_ce test passed ==="
40 changes: 40 additions & 0 deletions test/docker-in-docker/scenarios.json
Original file line number Diff line number Diff line change
Expand Up @@ -177,5 +177,45 @@
},
"remoteUser": "vscode",
"onCreateCommand": "docker ps && sleep 5s && docker ps"
},
"azure_linux": {
"image": "mcr.microsoft.com/azurelinux/base/core:3.0",
"features": {
"docker-in-docker": {
"version": "latest",
"moby": "true",
"azureDnsAutoDetection": false
}
}
},
"azure_linux_docker_ce": {
"image": "mcr.microsoft.com/azurelinux/base/core:3.0",
"features": {
"docker-in-docker": {
"version": "latest",
"moby": "false",
"azureDnsAutoDetection": false
}
}
},
"cbl_mariner": {
"image": "mcr.microsoft.com/cbl-mariner/base/core:2.0",
"features": {
"docker-in-docker": {
"version": "latest",
"moby": "true",
"azureDnsAutoDetection": false
}
}
},
"cbl_mariner_docker_ce": {
"image": "mcr.microsoft.com/cbl-mariner/base/core:2.0",
"features": {
"docker-in-docker": {
"version": "latest",
"moby": "false",
"azureDnsAutoDetection": false
}
}
}
}