Docker Multi-Architecture Quick Reference

📋 Common Commands

Basic Building

# Build for current architecture
cd backend
docker build -f Dockerfile.fastapi -t financial-extractor:latest .

# Build for specific architecture
docker buildx build --platform linux/arm64 -t financial-extractor:arm64 .

# Build and load locally (single arch only)
docker buildx build --platform linux/amd64 --load -t financial-extractor:test .

Multi-Architecture Building

# Build for AMD64 and ARM64
./scripts/build-multiarch.sh --platform linux/amd64,linux/arm64

# Build and push to registry
./scripts/build-multiarch.sh --platform linux/amd64,linux/arm64 --push --tag v1.0.0

# Build for all common architectures
./scripts/build-multiarch.sh --platform linux/amd64,linux/arm64,linux/arm/v7

# Dry run (see what would happen)
./scripts/build-multiarch.sh --dry-run --platform linux/amd64,linux/arm64

Testing

# Test current architecture
./scripts/test-architectures.sh

# Test specific architectures
./scripts/test-architectures.sh --architectures amd64,arm64

# Quick test (skip package verification)
./scripts/test-architectures.sh --quick

# Keep images after testing
./scripts/test-architectures.sh --keep-images

# Test camelot-py on ARM64
./scripts/test-camelot-arm64.sh
./scripts/investigate-camelot.sh

Docker Compose

# Build and run
cd infrastructure/docker
docker compose -f docker-compose.multiarch.yml up --build

# Build only
docker compose -f docker-compose.multiarch.yml build

# Run in background
docker compose -f docker-compose.multiarch.yml up -d

# Stop and remove
docker compose -f docker-compose.multiarch.yml down

🔍 Inspection & Debugging

Image Inspection

# Check what's in the image
docker run --rm financial-extractor:latest cat /app/build_info.txt

# Inspect image metadata
docker inspect financial-extractor:latest

# Check architecture
docker image inspect financial-extractor:latest --format ''

# View build history
docker history financial-extractor:latest

Multi-Arch Manifest

# View manifest (after pushing)
docker buildx imagetools inspect yourregistry/financial-extractor:latest

# Check available platforms
docker manifest inspect yourregistry/financial-extractor:latest

Package Verification

# Check if package is available
docker run --rm financial-extractor:latest python -c "import camelot; print('✓')"

# List installed packages
docker run --rm financial-extractor:latest pip list

# Check Python version
docker run --rm financial-extractor:latest python --version

Debugging Failed Builds

# Verbose build output
docker buildx build --progress=plain --no-cache -f Dockerfile.fastapi .

# Enter container for debugging
docker run -it --entrypoint /bin/bash financial-extractor:latest

# Check logs
docker logs <container-id>

🎯 Quick Fixes

Problem: Build fails on ARM64

# Check exclusions config
grep -A20 "arch_exclusions.json" Dockerfile.fastapi

# Build with verbose output
docker buildx build --platform linux/arm64 --progress=plain . 2>&1 | tee build.log

Problem: Package not found

# Verify package in virtual environment
docker run --rm financial-extractor:latest /app/.venv/bin/pip list | grep <package-name>

# Check if package should be excluded
docker run --rm financial-extractor:latest cat /tmp/arch_exclusions.json

Problem: Health check failing

# Check if service is running
docker run -p 3030:3030 financial-extractor:latest

# Test health endpoint manually
curl http://localhost:3030/healthcheck

🛠️ Configuration

Modify Architecture Exclusions

Edit the JSON in Dockerfile.fastapi (around line 40):

{
  "arm64": {
    "exclude": ["package-name"],
    "reason": "Why it's excluded"
  }
}

Add Optional Package

Add to the optional_packages dict in Dockerfile.fastapi (around line 151):

'package-name[extras]': {
    'import_name': 'pkg',
    'description': 'What it does'
}

📦 Registry Operations

Tag and Push

# Tag image
docker tag financial-extractor:latest registry.example.com/financial-extractor:v1.0.0

# Push single architecture
docker push registry.example.com/financial-extractor:v1.0.0

# Build and push multi-arch
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  --tag registry.example.com/financial-extractor:v1.0.0 \
  --push \
  -f Dockerfile.fastapi \
  .

Pull and Run

# Pull image (auto-detects architecture)
docker pull registry.example.com/financial-extractor:v1.0.0

# Run with environment variables
docker run -p 3030:3030 \
  -e DATABASE_URL=postgresql://... \
  registry.example.com/financial-extractor:v1.0.0

🔐 Security

Scan for Vulnerabilities

# Using Docker scan
docker scan financial-extractor:latest

# Using Trivy
trivy image financial-extractor:latest

# Using Snyk
snyk container test financial-extractor:latest

Check User

# Verify running as non-root
docker run --rm financial-extractor:latest whoami
# Should output: appuser

🎨 Development

Hot Reload Mode

# Run with code mounted as volume
docker run -p 3030:3030 \
  -v $(pwd)/app:/app/app:ro \
  financial-extractor:latest \
  uvicorn run:application --reload --host 0.0.0.0

Debug Mode

# Run with Python debugger
docker run -p 3030:3030 -it \
  financial-extractor:latest \
  python -m pdb -m uvicorn run:application --host 0.0.0.0

📊 Performance

Check Build Cache

# View cache
ls -lh /tmp/.buildx-cache

# Clear cache
rm -rf /tmp/.buildx-cache

Build with Cache

# Use cache mount
docker buildx build \
  --cache-from type=local,src=/tmp/.buildx-cache \
  --cache-to type=local,dest=/tmp/.buildx-cache \
  -t financial-extractor:latest \
  -f Dockerfile.fastapi \
  .

🔄 CI/CD Integration

GitHub Actions

- name: Build multi-arch
  run: |
    docker buildx build \
      --platform linux/amd64,linux/arm64 \
      --tag $/financial-extractor:$ \
      --push \
      -f backend/Dockerfile.fastapi \
      backend/

GitLab CI

build:
  script:
    - docker buildx build 
        --platform linux/amd64,linux/arm64
        --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
        --push
        -f backend/Dockerfile.fastapi
        backend/

💡 Tips & Tricks

Speed Up Builds

# Use buildkit cache
export DOCKER_BUILDKIT=1

# Parallel builds
docker buildx build --platform linux/amd64,linux/arm64 ...

Save Build Logs

# Save to file
docker buildx build . 2>&1 | tee build-$(date +%Y%m%d-%H%M%S).log

Extract Files from Image

# Copy file from image
docker create --name temp financial-extractor:latest
docker cp temp:/app/build_info.txt .
docker rm temp

📱 Platform Detection

# Check your current platform
docker version --format ''

# Check QEMU support
docker run --rm --privileged tonistiigi/binfmt

# List supported platforms
docker buildx ls

🆘 Emergency Commands

Stop All Containers

docker stop $(docker ps -q)

Remove All Test Images

docker rmi $(docker images 'test-arch-*' -q)

Clean Everything

# Remove all stopped containers, unused networks, dangling images
docker system prune -a

# Remove build cache
docker builder prune -a

🎯 One-Liners

# Build, test, and push in one go
./scripts/test-architectures.sh && ./scripts/build-multiarch.sh --push

# Quick local test
docker build -t test . && docker run --rm test python -c "import fastapi; print('OK')"

# Check image size
docker images financial-extractor --format ": - "

# Find largest layers
docker history financial-extractor:latest --no-trunc --format "\t" | sort -hr | head -10

✅ Checklist

Before deploying:

  • Tested on target architectures
  • Health check works
  • Environment variables configured
  • Volumes mounted correctly
  • Resource limits set
  • Security scan passed
  • Documentation updated

Pro Tip: Bookmark this file for quick reference! 📌