Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
}
}
}
}