🐳 feat: implement Docker multi-stage build with caching optimization
Added Docker build infrastructure: - Multi-stage build (builder, cache, production) - Dependency hashing for cache invalidation - GNU tar support for cache compatibility - Production and development Dockerfiles - Docker Compose for local development Build Optimization: - Dependency-based cache keys - Layer caching strategy - Cross-platform compatibility - Gitea Actions cache integration Files Added: - docker/Dockerfile.build - Build environment - docker/Dockerfile.prod - Production image - docker/Dockerfile.prod.template - Template-based generation - docker-compose.yml - Development setup - scripts/calculate-deps-hash.sh - Cache key calculation - scripts/test-docker-cache.sh - Cache testing Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
86
scripts/test-docker-cache.sh
Executable file
86
scripts/test-docker-cache.sh
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/bin/bash
|
||||
# Test Docker build cache functionality locally
|
||||
# Usage: scripts/test-docker-cache.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🧪 Testing Docker Build Cache"
|
||||
echo "============================"
|
||||
echo ""
|
||||
|
||||
# Check requirements
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
echo "❌ Docker not found. Please install Docker first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v go >/dev/null 2>&1; then
|
||||
echo "❌ Go not found. Please install Go 1.26.1+."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Requirements met"
|
||||
echo ""
|
||||
|
||||
# 1. Calculate dependency hash (same as CI)
|
||||
echo "1. Calculating dependency hash..."
|
||||
# Use shasum on macOS, sha256sum on Linux
|
||||
if command -v sha256sum >/dev/null 2>&1; then
|
||||
DEPS_HASH=$(sha256sum go.mod go.sum | sha256sum | cut -d' ' -f1 | head -c 12)
|
||||
else
|
||||
DEPS_HASH=$(shasum -a 256 go.mod go.sum | shasum -a 256 | cut -d' ' -f1 | head -c 12)
|
||||
fi
|
||||
echo " Dependency hash: $DEPS_HASH"
|
||||
echo ""
|
||||
|
||||
# 2. Build Docker cache image
|
||||
echo "2. Building Docker cache image..."
|
||||
IMAGE_NAME="dance-lessons-coach-build-cache:$DEPS_HASH"
|
||||
echo " Image name: $IMAGE_NAME"
|
||||
|
||||
docker build -t "$IMAGE_NAME" -f Dockerfile.build .
|
||||
echo "✅ Docker image built successfully"
|
||||
echo ""
|
||||
|
||||
# 3. Test running commands in Docker
|
||||
echo "3. Testing Docker execution..."
|
||||
|
||||
echo " Testing 'go version'..."
|
||||
docker run --rm -v "$(pwd):/workspace" -w /workspace "$IMAGE_NAME" go version
|
||||
echo " ✅ Go version command works"
|
||||
|
||||
echo " Testing 'go build'..."
|
||||
docker run --rm -v "$(pwd):/workspace" -w /workspace "$IMAGE_NAME" go build -o /tmp/test ./cmd/greet
|
||||
echo " ✅ Go build command works"
|
||||
|
||||
echo " Testing 'swag' availability..."
|
||||
docker run --rm -v "$(pwd):/workspace" -w /workspace "$IMAGE_NAME" swag --version || echo " ⚠️ Swag not available"
|
||||
echo ""
|
||||
|
||||
# 4. Performance comparison
|
||||
echo "4. Performance comparison..."
|
||||
|
||||
echo " Running 'go build' natively..."
|
||||
START=$(date +%s%N)
|
||||
go build -o /tmp/native-test ./cmd/greet > /dev/null 2>&1
|
||||
NATIVE_TIME=$((($(date +%s%N) - $START)/1000000))
|
||||
echo " Native build: ${NATIVE_TIME}ms"
|
||||
|
||||
echo " Running 'go build' in Docker..."
|
||||
START=$(date +%s%N)
|
||||
docker run --rm -v "$(pwd):/workspace" -w /workspace "$IMAGE_NAME" go build -o /tmp/docker-test ./cmd/greet > /dev/null 2>&1
|
||||
DOCKER_TIME=$((($(date +%s%N) - $START)/1000000))
|
||||
echo " Docker build: ${DOCKER_TIME}ms"
|
||||
|
||||
echo " Overhead: $((DOCKER_TIME - NATIVE_TIME))ms"
|
||||
echo ""
|
||||
|
||||
# Clean up
|
||||
rm -f /tmp/native-test /tmp/docker-test
|
||||
|
||||
echo "✅ Docker cache testing complete!"
|
||||
echo ""
|
||||
echo "💡 The Docker image is ready for CI use."
|
||||
echo "💡 Push this image to your registry for CI caching:"
|
||||
echo " docker tag $IMAGE_NAME your-registry/$IMAGE_NAME"
|
||||
echo " docker push your-registry/$IMAGE_NAME"
|
||||
Reference in New Issue
Block a user