Files
attune/docker/enable-buildkit.sh
2026-02-04 17:46:30 -06:00

200 lines
5.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# enable-buildkit.sh - Enable Docker BuildKit for faster Rust builds
# This script configures Docker to use BuildKit, which enables cache mounts
# for dramatically faster incremental builds
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_warning() {
echo -e "${YELLOW}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_info() {
echo -e "${BLUE} $1${NC}"
}
echo -e "${BLUE}=================================================="
echo "Docker BuildKit Configuration"
echo -e "==================================================${NC}\n"
# Check if Docker is installed
if ! command -v docker &> /dev/null; then
print_error "Docker is not installed"
exit 1
fi
print_success "Docker is installed"
# Check current BuildKit status
print_info "Checking current BuildKit configuration..."
if [ -n "$DOCKER_BUILDKIT" ]; then
print_info "DOCKER_BUILDKIT environment variable is set to: $DOCKER_BUILDKIT"
else
print_warning "DOCKER_BUILDKIT environment variable is not set"
fi
# Determine shell
SHELL_NAME=$(basename "$SHELL")
SHELL_RC=""
case "$SHELL_NAME" in
bash)
if [ -f "$HOME/.bashrc" ]; then
SHELL_RC="$HOME/.bashrc"
elif [ -f "$HOME/.bash_profile" ]; then
SHELL_RC="$HOME/.bash_profile"
fi
;;
zsh)
SHELL_RC="$HOME/.zshrc"
;;
fish)
SHELL_RC="$HOME/.config/fish/config.fish"
;;
*)
SHELL_RC="$HOME/.profile"
;;
esac
echo ""
print_info "Detected shell: $SHELL_NAME"
print_info "Shell configuration file: $SHELL_RC"
# Check if already configured
if [ -f "$SHELL_RC" ] && grep -q "DOCKER_BUILDKIT" "$SHELL_RC"; then
echo ""
print_success "BuildKit is already configured in $SHELL_RC"
# Check if it's enabled
if grep -q "export DOCKER_BUILDKIT=1" "$SHELL_RC"; then
print_success "BuildKit is ENABLED"
else
print_warning "BuildKit configuration found but may not be enabled"
print_info "Check your $SHELL_RC file"
fi
else
echo ""
print_warning "BuildKit is not configured in your shell"
read -p "Would you like to enable BuildKit globally? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "" >> "$SHELL_RC"
echo "# Enable Docker BuildKit for faster builds" >> "$SHELL_RC"
echo "export DOCKER_BUILDKIT=1" >> "$SHELL_RC"
echo "export COMPOSE_DOCKER_CLI_BUILD=1" >> "$SHELL_RC"
print_success "BuildKit configuration added to $SHELL_RC"
print_info "Run: source $SHELL_RC (or restart your terminal)"
fi
fi
# Check Docker daemon configuration
DOCKER_CONFIG="/etc/docker/daemon.json"
HAS_SUDO=false
if command -v sudo &> /dev/null; then
HAS_SUDO=true
fi
echo ""
print_info "Checking Docker daemon configuration..."
if [ -f "$DOCKER_CONFIG" ]; then
if $HAS_SUDO && sudo test -r "$DOCKER_CONFIG"; then
if sudo grep -q "\"features\"" "$DOCKER_CONFIG" && sudo grep -q "\"buildkit\"" "$DOCKER_CONFIG"; then
print_success "BuildKit appears to be configured in Docker daemon"
else
print_warning "BuildKit may not be configured in Docker daemon"
print_info "This is optional - environment variables are sufficient"
fi
else
print_warning "Cannot read $DOCKER_CONFIG (permission denied)"
print_info "This is normal for non-root users"
fi
else
print_info "Docker daemon config not found at $DOCKER_CONFIG"
print_info "This is normal - environment variables work fine"
fi
# Test BuildKit
echo ""
print_info "Testing BuildKit availability..."
# Create a minimal test Dockerfile
TEST_DIR=$(mktemp -d)
cat > "$TEST_DIR/Dockerfile" <<'EOF'
FROM alpine:latest
RUN --mount=type=cache,target=/tmp/cache echo "BuildKit works!" > /tmp/cache/test
RUN echo "Test complete"
EOF
if DOCKER_BUILDKIT=1 docker build -q "$TEST_DIR" > /dev/null 2>&1; then
print_success "BuildKit is working correctly!"
print_success "Cache mounts are supported"
else
print_error "BuildKit test failed"
print_info "Your Docker version may not support BuildKit"
print_info "BuildKit requires Docker 18.09+ with experimental features enabled"
fi
# Cleanup
rm -rf "$TEST_DIR"
# Display usage information
echo ""
echo -e "${BLUE}=================================================="
echo "Usage Information"
echo -e "==================================================${NC}"
echo ""
echo "To use BuildKit with Attune:"
echo ""
echo "1. Build with docker compose (recommended):"
echo " export DOCKER_BUILDKIT=1"
echo " docker compose build"
echo ""
echo "2. Build individual service:"
echo " DOCKER_BUILDKIT=1 docker build --build-arg SERVICE=api -f docker/Dockerfile -t attune-api ."
echo ""
echo "3. Use Makefile:"
echo " export DOCKER_BUILDKIT=1"
echo " make docker-build"
echo ""
echo -e "${GREEN}Benefits of BuildKit:${NC}"
echo " • First build: ~5-6 minutes"
echo " • Incremental builds: ~30-60 seconds (instead of 5+ minutes)"
echo " • Caches: Cargo registry, git dependencies, compilation artifacts"
echo " • Parallel builds and improved layer caching"
echo ""
echo -e "${YELLOW}Note:${NC} Cache persists between builds, potentially using 5-10GB disk space"
echo " To clear cache: docker builder prune"
echo ""
# Check for current environment
if [ "$DOCKER_BUILDKIT" = "1" ]; then
print_success "BuildKit is currently ENABLED in this shell session"
else
print_warning "BuildKit is NOT enabled in the current shell session"
print_info "Run: export DOCKER_BUILDKIT=1"
fi
echo ""
print_success "Configuration check complete!"