| name | deployment-automation |
| description | Agents should invoke this skill for Docker Compose deployments, container updates, stack health checks, rollbacks, compose-file changes, image upgrades, failed deploys, or service restart planning. Provides safe deployment and rollback workflows. |
Deployment Automation
Manage Docker Compose deployments, container lifecycle, image updates, and rollbacks.
Quick Start
Deploy a Compose Stack
docker compose up -d
docker compose up -d --build
docker compose ps
Update a Running Service
docker compose pull
docker compose up -d --remove-orphans
docker compose ps
docker compose logs --tail=20 <service>
Docker Compose Management
Lifecycle Commands
docker compose up -d
docker compose down
docker compose down -v
docker compose restart <service>
docker compose up -d --scale <service>=3
docker compose logs -f <service>
docker compose logs --tail=50 <service>
Stack Health Check
docker compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
docker inspect <container> | jq '.[0].State'
Image Update Workflow
Safe update process with rollback path:
Step 1: Pre-Update Checks
docker compose ps > /tmp/pre-update-state.txt
docker compose config --images > /tmp/current-images.txt
docker compose images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}"
Step 2: Pull New Images
docker compose pull
docker compose images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}"
Step 3: Deploy Update
docker compose up -d --remove-orphans
sleep 10
docker compose ps
Step 4: Post-Update Verification
docker compose ps --format "{{.Name}}: {{.Status}}" | grep -i "restarting"
docker compose logs --since 2m --tail=50 2>&1 | grep -iE "error|fatal|panic"
curl -s -o /dev/null -w "%{http_code}" http://localhost:<port>/health
Step 5: Rollback (If Needed)
docker compose down
docker compose up -d
docker tag <service>:previous <service>:latest
docker compose up -d
Health Check Patterns
In Compose Files
Always include health checks in new deployments:
services:
myservice:
image: myimage:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
restart: unless-stopped
Common Health Check Types
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
healthcheck:
test: ["CMD", "nc", "-z", "localhost", "5432"]
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://localhost:80 || exit 1"]
Monitor Health Status
docker ps --format "table {{.Names}}\t{{.Status}}"
docker inspect --format='{{json .State.Health}}' <container> | jq '.'
docker ps --filter "health=unhealthy"
Container Cleanup
Regular Maintenance
docker container prune -f
docker image prune -f
docker image prune -a -f
docker volume prune -f
docker network prune -f
docker system prune -f
docker system prune -a --volumes -f
Disk Usage
docker system df
docker system df -v
Compose File Best Practices
Template for New Services
version: "3.8"
services:
servicename:
image: image:tag
container_name: servicename
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
environment:
- TZ=Etc/UTC
volumes:
- servicename_data:/data
ports:
- "8080:8080"
networks:
- default
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
volumes:
servicename_data:
networks:
default:
Key Principles
- Pin image tags — Use
image:1.2.3 not image:latest for production
- Always health check — Every service should have a health check
- Always restart policy —
unless-stopped or always
- Log rotation — Set
max-size and max-file to prevent disk fill
- Named volumes — Use named volumes, not bind mounts, for data persistence
- Timezone — Set
TZ=Etc/UTC for consistent logs
- Resource limits — Set memory/CPU limits for critical services
Resource Limits
services:
myservice:
deploy:
resources:
limits:
memory: 512M
cpus: "0.5"
reservations:
memory: 256M
cpus: "0.25"
Rollback Strategies
Strategy 1: Image Tag Pinning
docker compose images
docker compose up -d
Strategy 2: Docker Image Tagging
docker tag myimage:latest myimage:rollback
docker compose pull
docker compose up -d
docker tag myimage:rollback myimage:latest
docker compose up -d
Strategy 3: Compose File Versioning
cp docker-compose.yml docker-compose.yml.bak
docker compose up -d
cp docker-compose.yml.bak docker-compose.yml
docker compose up -d
Troubleshooting
Container Won't Start
docker compose logs <service>
ss -tlnp | grep <port>
docker images | grep <image>
docker compose run --rm <service> sh
Container Keeps Restarting
docker inspect <container> --format='{{.RestartCount}}'
docker inspect <container> --format='{{.State.ExitCode}}'
docker inspect <container> --format='{{.State.OOMKilled}}'
docker logs --tail=50 <container>
Out of Disk Space
docker system df
docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}" | sort -k2 -h
docker system prune -f
docker image prune -a -f
Kai skill — Docker deployment and lifecycle management