Docker Workflows
A complete workflow for Docker development including building, pushing, docker-compose, and cleanup.
Complete Jakefile
Section titled “Complete Jakefile”# Docker Workflow Jakefile# ========================
@dotenv@require DOCKER_REGISTRY
# Configurationapp_name = "myapp"registry = "${DOCKER_REGISTRY}"tag = "latest"
# === Building ===
@default@group dockertask build: @description "Build Docker image" @needs docker @pre echo "Building {{app_name}}:{{tag}}..." docker build -t {{app_name}}:{{tag}} . docker tag {{app_name}}:{{tag}} {{registry}}/{{app_name}}:{{tag}} @post echo "Built: {{registry}}/{{app_name}}:{{tag}}"
@group dockertask build-no-cache: @description "Build without cache" @needs docker docker build --no-cache -t {{app_name}}:{{tag}} .
@group dockertask build-multi-platform: @description "Build for multiple architectures" @needs docker docker buildx build \ --platform linux/amd64,linux/arm64 \ -t {{registry}}/{{app_name}}:{{tag}} \ --push \ . echo "Multi-platform image pushed"
# === Registry Operations ===
@group registrytask login: @description "Login to Docker registry" @require DOCKER_USERNAME DOCKER_PASSWORD echo $DOCKER_PASSWORD | docker login {{registry}} -u $DOCKER_USERNAME --password-stdin echo "Logged in to {{registry}}"
@group registrytask push: [build] @description "Push image to registry" @needs docker @confirm "Push {{app_name}}:{{tag}} to {{registry}}?" docker push {{registry}}/{{app_name}}:{{tag}} @post echo "Pushed: {{registry}}/{{app_name}}:{{tag}}"
@group registrytask pull: @description "Pull latest image" @needs docker docker pull {{registry}}/{{app_name}}:{{tag}}
# === Local Development ===
@group devtask up: @description "Start services with docker-compose" @needs docker-compose docker-compose up -d @post echo "Services started"
@group devtask down: @description "Stop services" @needs docker-compose docker-compose down @post echo "Services stopped"
@group devtask restart: [down, up] @description "Restart all services" echo "Services restarted"
@group devtask logs: @description "Follow container logs" @needs docker-compose docker-compose logs -f
@group devtask shell: @description "Open shell in app container" @needs docker docker-compose exec app /bin/sh
@group devtask ps: @description "List running containers" docker-compose ps
# === Database Containers ===
@group dbtask db-start: @description "Start database container only" docker-compose up -d db @post echo "Database started"
@group dbtask db-stop: @description "Stop database container" docker-compose stop db
@group dbtask db-shell: @description "Open database CLI" docker-compose exec db psql -U postgres
@group dbtask db-reset: @description "Reset database (DESTRUCTIVE)" @confirm "This will DELETE all data. Continue?" docker-compose stop db docker-compose rm -f db docker volume rm $(docker volume ls -q | grep db-data) 2>/dev/null || true docker-compose up -d db @post echo "Database reset complete"
# === Cleanup ===
@group cleanuptask clean-containers: @description "Remove stopped containers" docker container prune -f echo "Removed stopped containers"
@group cleanuptask clean-images: @description "Remove dangling images" docker image prune -f echo "Removed dangling images"
@group cleanuptask clean-volumes: @description "Remove unused volumes" @confirm "Remove unused volumes?" docker volume prune -f echo "Removed unused volumes"
@group cleanuptask clean-all: [clean-containers, clean-images] @description "Full Docker cleanup" @confirm "This will remove all unused Docker resources. Continue?" docker system prune -af echo "Full cleanup complete"
# === Production ===
@group prodtask deploy: [build, push] @description "Build and deploy to production" @confirm "Deploy to production?" @require DEPLOY_HOST ssh $DEPLOY_HOST "docker pull {{registry}}/{{app_name}}:{{tag}} && docker-compose up -d" @post echo "Deployed to production!"
@group prodtask rollback: @description "Rollback to previous version" @require DEPLOY_HOST PREVIOUS_TAG @confirm "Rollback to $PREVIOUS_TAG?" ssh $DEPLOY_HOST "docker pull {{registry}}/{{app_name}}:$PREVIOUS_TAG && docker-compose up -d" echo "Rolled back to $PREVIOUS_TAG"
# === Utility ===
task version: @description "Show current image version" @quiet docker images {{app_name}} --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedSince}}"jake build # Build Docker imagejake build tag=v1.2.3 # Build with specific tagjake up # Start docker-compose servicesjake logs # Follow logsjake push # Push to registryjake deploy # Deploy to productionjake clean-all # Full Docker cleanupKey Features
Section titled “Key Features”Tagged Builds
Section titled “Tagged Builds”Override the tag with parameters:
jake build tag=v1.2.3jake push tag=v1.2.3Multi-Platform Builds
Section titled “Multi-Platform Builds”Build for multiple architectures with buildx:
task build-multi-platform: docker buildx build \ --platform linux/amd64,linux/arm64 \ -t {{registry}}/{{app_name}}:{{tag}} \ --push \ .Development Workflow
Section titled “Development Workflow”Quick commands for local development:
jake up # Start servicesjake logs # View logsjake shell # Enter containerjake restart # Restart everythingjake down # Stop servicesSafe Destructive Operations
Section titled “Safe Destructive Operations”Confirmations for dangerous commands:
task db-reset: @confirm "This will DELETE all data. Continue?" # ... reset databaseCustomization
Section titled “Customization”Update configuration variables:
app_name = "myapp";registry = "${DOCKER_REGISTRY}";tag = "latest";docker-compose.yml Example
Section titled “docker-compose.yml Example”version: "3.8"services: app: build: . ports: - "3000:3000" depends_on: - db environment: - DATABASE_URL=postgres://postgres:postgres@db:5432/myapp
db: image: postgres:15 volumes: - db-data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=postgres - POSTGRES_DB=myapp
volumes: db-data:See Also
Section titled “See Also”- Environment Validation -
@requirefor credentials - CI/CD Integration - Automated Docker builds