Docker Builds¶
Complete guide to building C++ libraries using Docker with CCGO for universal cross-platform compilation.
Overview¶
CCGO's Docker builds enable universal cross-platform compilation - build libraries for any platform from any host operating system without installing platform-specific toolchains.
Key features:
- Build anywhere: Compile for Linux, Windows, macOS, iOS, watchOS, tvOS, Android on any OS
- Zero dependencies: No Xcode, Visual Studio, Android Studio, or SDK installations required
- Prebuilt images: Fast setup with images from Docker Hub (3-20x faster than manual builds)
- Consistent environment: Same toolchain versions across all developers
- Isolated builds: No conflicts with host system tools
- Reproducible: Guaranteed identical builds across different machines
Why Use Docker Builds?¶
Without Docker¶
Limitations: - Platform locked: Need macOS for iOS/macOS, Windows for MSVC, Linux for Linux - Complex setup: Install and configure multiple SDKs and toolchains - Version conflicts: Different projects may need different toolchain versions - Storage overhead: SDKs can consume 10-50GB per platform - Setup time: Hours to install and configure all tools
With Docker¶
Benefits: - Platform agnostic: Build any platform from any OS - Quick setup: Download prebuilt images (2-10 minutes) - Smaller footprint: Images are 800MB-3.5GB vs 10-50GB SDKs - Instant switch: Switch between toolchain versions easily - CI/CD ready: Perfect for automated builds - Reproducible: Same environment everywhere
Supported Platforms¶
| Platform | Docker Image | Size | Toolchain | Host OS |
|---|---|---|---|---|
| Linux | ccgo-builder-linux |
~800MB | GCC, Clang, CMake | Any |
| Windows | ccgo-builder-windows |
~1.2GB | MinGW-w64, CMake | Any |
| macOS | ccgo-builder-apple |
~2.5GB | OSXCross, CMake | Any |
| iOS | ccgo-builder-apple |
~2.5GB | OSXCross, CMake | Any |
| watchOS | ccgo-builder-apple |
~2.5GB | OSXCross, CMake | Any |
| tvOS | ccgo-builder-apple |
~2.5GB | OSXCross, CMake | Any |
| Android | ccgo-builder-android |
~3.5GB | Android NDK, CMake | Any |
Note: Apple platforms (macOS, iOS, watchOS, tvOS) share the same image.
Prerequisites¶
Install Docker Desktop¶
macOS:
# Download from docker.com or use Homebrew
brew install --cask docker
# Start Docker Desktop
open -a Docker
Windows:
Linux:
# Ubuntu/Debian
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
# Add user to docker group
sudo usermod -aG docker $USER
# Log out and back in
# Verify
docker --version
System Requirements¶
- Disk space: 5-10GB for all Docker images
- Memory: 4GB+ RAM recommended
- CPU: Modern multi-core processor recommended
- Network: Fast internet for first-time image download
Quick Start¶
Basic Docker Builds¶
# Build for Linux from any OS
ccgo build linux --docker
# Build for Windows from macOS or Linux
ccgo build windows --docker
# Build for macOS from Windows or Linux
ccgo build macos --docker
# Build for iOS from Windows or Linux
ccgo build ios --docker
# Build for Android from any OS
ccgo build android --docker
First Build (Image Download)¶
# First time: Downloads prebuilt image
$ ccgo build linux --docker
Pulling Docker image ccgo-builder-linux:latest...
latest: Pulling from ccgo/ccgo-builder-linux
Digest: sha256:abc123...
Status: Downloaded newer image for ccgo-builder-linux:latest
Building in Docker container...
[Build output...]
Build complete!
Download times (first build only): - Linux: ~2-3 minutes (~800MB) - Windows: ~3-4 minutes (~1.2GB) - Apple: ~5-8 minutes (~2.5GB) - Android: ~8-10 minutes (~3.5GB)
Subsequent Builds¶
# All subsequent builds use cached image (instant startup)
$ ccgo build linux --docker
Using existing Docker image ccgo-builder-linux:latest...
Building in Docker container...
[Build output...]
Build complete!
How Docker Builds Work¶
Build Process¶
- Image Selection: CCGO selects appropriate Docker image for target platform
- Image Download: Pulls prebuilt image from Docker Hub (first time only)
- Container Launch: Starts Docker container with mounted project directory
- Build Execution: Runs build inside container using platform toolchain
- Output Collection: Writes build artifacts to host filesystem
- Cleanup: Container is removed (image remains cached)
File System Mounting¶
Host Docker Container
==== ================
/project/ --> /workspace/
├── src/ ├── src/
├── include/ ├── include/
├── CCGO.toml ├── CCGO.toml
└── target/ <-- └── target/
└── linux/ └── linux/
- Project directory mounted read-only
- Output directory mounted read-write
- Build artifacts written to host filesystem
Toolchain Environments¶
Linux container:
Windows container:
Apple container:
Android container:
Docker Image Management¶
List Downloaded Images¶
# List CCGO Docker images
docker images | grep ccgo-builder
# Output:
# ccgo-builder-linux latest abc123 2 weeks ago 800MB
# ccgo-builder-windows latest def456 2 weeks ago 1.2GB
# ccgo-builder-apple latest ghi789 2 weeks ago 2.5GB
Update Images¶
# Update all images to latest version
docker pull ccgo-builder-linux:latest
docker pull ccgo-builder-windows:latest
docker pull ccgo-builder-apple:latest
docker pull ccgo-builder-android:latest
Remove Images¶
# Remove specific image
docker rmi ccgo-builder-linux:latest
# Remove all CCGO images
docker rmi $(docker images -q "ccgo-builder-*")
# Reclaim space
docker system prune -a
Disk Space¶
# Check Docker disk usage
docker system df
# Output:
# TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 4 0 7.8GB 7.8GB (100%)
# Containers 0 0 0B 0B
# Local Volumes 0 0 0B 0B
Advanced Usage¶
Build Multiple Platforms¶
# Build for all mobile platforms
ccgo build android --docker
ccgo build ios --docker
# Build for all desktop platforms
ccgo build linux --docker
ccgo build windows --docker
ccgo build macos --docker
Architecture Selection¶
# Android - multiple architectures
ccgo build android --docker --arch armeabi-v7a,arm64-v8a,x86_64
# iOS - build for device and simulator
ccgo build ios --docker --arch arm64,x86_64
# Windows - different architectures
ccgo build windows --docker --arch x86,x64,arm64
Custom Docker Options¶
# Pass custom Docker run options
DOCKER_OPTS="--cpus=4 --memory=8g" ccgo build linux --docker
# Mount additional volumes
DOCKER_OPTS="-v /extra/libs:/libs:ro" ccgo build linux --docker
Parallel Builds¶
# Build multiple platforms in parallel
ccgo build linux --docker &
ccgo build windows --docker &
ccgo build macos --docker &
wait
echo "All builds complete!"
Platform-Specific Notes¶
Linux Docker Builds¶
Advantages: - Build on macOS or Windows - Consistent glibc version - Both GCC and Clang available
Limitations: - Cannot run GUI applications - Cannot test applications (no X11 display)
Usage:
# Build for x86_64
ccgo build linux --docker --arch x86_64
# Build for ARM64
ccgo build linux --docker --arch arm64
# Build with specific compiler
ccgo build linux --docker --compiler clang
Windows Docker Builds¶
Advantages: - Build on macOS or Linux - No Visual Studio required
Limitations: - MinGW only (no MSVC) - Output may not be compatible with MSVC-built code - Cannot run Windows applications
Usage:
# Build for x64
ccgo build windows --docker --arch x64
# Build for x86
ccgo build windows --docker --arch x86
# Build both architectures
ccgo build windows --docker --arch x86,x64
MSVC compatibility note: - Docker builds use MinGW-w64 (GCC for Windows) - For MSVC builds, use native Windows build - MinGW and MSVC have different ABI (not binary compatible)
Apple Docker Builds¶
Advantages: - Build macOS/iOS/watchOS/tvOS on Windows or Linux - No Xcode or macOS required - Uses OSXCross (LLVM-based)
Limitations: - Cannot code sign applications - Cannot run or test applications - Cannot notarize applications - No Xcode project generation
Usage:
# Build for macOS
ccgo build macos --docker
# Build for iOS
ccgo build ios --docker
# Build for multiple Apple platforms
ccgo build macos --docker
ccgo build ios --docker
ccgo build watchos --docker
ccgo build tvos --docker
Android Docker Builds¶
Advantages: - Build on any OS - No Android Studio required - Consistent NDK version
Limitations: - Cannot run on Android devices - Cannot generate Android Studio projects - Cannot run tests
Usage:
# Build for all Android architectures
ccgo build android --docker --arch armeabi-v7a,arm64-v8a,x86,x86_64
# Build AAR package
ccgo build android --docker --aar
Troubleshooting¶
Docker Not Found¶
Solution:
# Install Docker Desktop and ensure it's running
docker --version
# macOS: Check if Docker Desktop is running
open -a Docker
Permission Denied¶
Solution (Linux):
# Add user to docker group
sudo usermod -aG docker $USER
# Log out and back in
# Or run with sudo (not recommended)
sudo ccgo build linux --docker
Image Pull Failed¶
Solution:
# Check internet connection
ping docker.io
# Try manual pull
docker pull ccgo-builder-linux:latest
# Check Docker Hub status
# https://status.docker.com/
Disk Space Issues¶
Solution:
# Check disk space
docker system df
# Clean up unused images
docker system prune -a
# Remove specific images
docker rmi ccgo-builder-linux:latest
Build Artifacts Not Found¶
Solution:
# Check Docker mount permissions
ls -la target/
# Ensure target directory exists and is writable
mkdir -p target
chmod 755 target
# Check Docker logs
docker logs $(docker ps -lq)
Slow Builds¶
Solution:
# Allocate more resources to Docker
# Docker Desktop → Preferences → Resources
# Increase: CPUs (4+), Memory (8GB+), Disk space
# Use Docker native rather than virtualization
# (faster on Linux)
# Enable BuildKit for faster image pulls
export DOCKER_BUILDKIT=1
Best Practices¶
1. Use Docker for CI/CD¶
Perfect for automated builds:
# .github/workflows/build.yml
name: Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build all platforms
run: |
ccgo build linux --docker
ccgo build windows --docker
ccgo build macos --docker
2. Cache Docker Images¶
Don't delete images between builds:
# Keep images cached for fast builds
# Only update when needed
docker pull ccgo-builder-linux:latest
3. Use for Reproducible Builds¶
Same environment everywhere:
# Development
ccgo build linux --docker
# CI/CD
ccgo build linux --docker
# Result: Identical binaries
4. Combine with Native Builds¶
Use Docker for cross-platform, native for platform-specific:
# On macOS
ccgo build macos # Native (code signing, testing)
ccgo build linux --docker # Docker (cross-compile)
ccgo build windows --docker # Docker (cross-compile)
5. Regular Image Updates¶
# Monthly: Update images
docker pull ccgo-builder-linux:latest
docker pull ccgo-builder-windows:latest
docker pull ccgo-builder-apple:latest
docker pull ccgo-builder-android:latest
6. Resource Allocation¶
# Allocate sufficient resources
# Docker Desktop → Preferences → Resources:
# - CPUs: 4-8 (more = faster parallel builds)
# - Memory: 8-16GB
# - Disk: 50GB+
Performance Optimization¶
Parallel Platform Builds¶
#!/bin/bash
# build-all.sh
echo "Building all platforms..."
ccgo build linux --docker &
PID_LINUX=$!
ccgo build windows --docker &
PID_WINDOWS=$!
ccgo build macos --docker &
PID_MACOS=$!
ccgo build android --docker &
PID_ANDROID=$!
wait $PID_LINUX $PID_WINDOWS $PID_MACOS $PID_ANDROID
echo "All builds complete!"
Incremental Builds¶
Docker builds support incremental compilation:
# First build (clean)
ccgo build linux --docker
# Subsequent builds (incremental)
# Only changed files are recompiled
ccgo build linux --docker
Resource Tuning¶
# Limit Docker resources for single build
DOCKER_OPTS="--cpus=2 --memory=4g" ccgo build linux --docker
# Maximum resources for faster builds
DOCKER_OPTS="--cpus=8 --memory=16g" ccgo build linux --docker
Security Considerations¶
1. Image Verification¶
# Verify image signatures (if available)
docker trust inspect ccgo-builder-linux:latest
# Check image digest
docker images --digests | grep ccgo-builder
2. Network Isolation¶
# Build without network access (after image download)
DOCKER_OPTS="--network=none" ccgo build linux --docker
3. Read-Only Mounts¶
# Mount source code read-only (default in CCGO)
DOCKER_OPTS="-v $(pwd):/workspace:ro" ccgo build linux --docker
4. User Permissions¶
# Run as non-root user inside container (CCGO default)
# Output files owned by current user
ls -l target/linux/
Comparison: Native vs Docker¶
| Aspect | Native Build | Docker Build |
|---|---|---|
| Setup time | Hours (SDK install) | Minutes (image download) |
| Disk space | 10-50GB per platform | 800MB-3.5GB per platform |
| Build speed | Faster (native) | Slightly slower (~10%) |
| Cross-platform | Limited (need target OS) | Full (any target from any OS) |
| Reproducibility | Medium (version drift) | High (fixed environment) |
| Code signing | Yes | No (Apple platforms) |
| Testing | Yes | Limited/No |
| CI/CD | Complex | Simple |
| Maintenance | Manual updates | Automatic (pull images) |
Recommendation: - Development: Native for target platform (better testing/debugging) - CI/CD: Docker for all platforms (consistency, reproducibility) - Cross-compilation: Docker always (only option without target OS)