Bash Automation Blueprint
These scripts automate common Docker maintenance tasks. Copy, adapt, and schedule them for your environment.
Health Check Script
Monitor all running containers and alert on unhealthy ones:
#!/usr/bin/env bash
set -euo pipefail
echo "=== Docker Health Check: $(date) ==="
# Check if Docker daemon is running
if ! docker info &>/dev/null; then
echo "CRITICAL: Docker daemon is not running!"
exit 1
fi
# Check each running container
UNHEALTHY=0
while IFS= read -r container; do
NAME=$(docker inspect "$container" --format '{{.Name}}' | sed 's/\///')
STATUS=$(docker inspect "$container" --format '{{.State.Status}}')
HEALTH=$(docker inspect "$container" --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}no-healthcheck{{end}}')
RESTARTS=$(docker inspect "$container" --format '{{.RestartCount}}')
OOM=$(docker inspect "$container" --format '{{.State.OOMKilled}}')
# Flag issues
if [[ "$HEALTH" == "unhealthy" ]] || [[ "$OOM" == "true" ]] || [[ "$RESTARTS" -gt 5 ]]; then
echo "WARNING: $NAME | status=$STATUS health=$HEALTH restarts=$RESTARTS oom=$OOM"
UNHEALTHY=$((UNHEALTHY + 1))
else
echo "OK: $NAME | status=$STATUS health=$HEALTH restarts=$RESTARTS"
fi
done < <(docker ps -q)
echo ""
echo "Total containers: $(docker ps -q | wc -l)"
echo "Issues found: $UNHEALTHY"
exit $UNHEALTHY
Disk Usage Monitor
Check disk usage and warn when thresholds are exceeded:
#!/usr/bin/env bash
set -euo pipefail
WARN_THRESHOLD=70 # Warn at 70% disk usage
CRIT_THRESHOLD=85 # Critical at 85%
echo "=== Docker Disk Monitor: $(date) ==="
# Host disk usage for Docker data directory
DISK_USAGE=$(df /var/lib/docker --output=pcent | tail -1 | tr -d '% ')
if [[ "$DISK_USAGE" -ge "$CRIT_THRESHOLD" ]]; then
echo "CRITICAL: Docker disk at ${DISK_USAGE}%"
echo "Run: docker system prune -f"
elif [[ "$DISK_USAGE" -ge "$WARN_THRESHOLD" ]]; then
echo "WARNING: Docker disk at ${DISK_USAGE}%"
else
echo "OK: Docker disk at ${DISK_USAGE}%"
fi
# Docker-specific breakdown
echo ""
docker system df
Safe Cleanup Script
Remove old resources with safety checks:
#!/usr/bin/env bash
set -euo pipefail
DRY_RUN=${1:-"--dry-run"}
echo "=== Docker Cleanup: $(date) ==="
echo "Mode: $DRY_RUN"
echo ""
# Show current usage
echo " Current Usage "
docker system df
echo ""
if [[ "$DRY_RUN" == "--execute" ]]; then
echo " Cleaning "
# Safe operations first
docker container prune -f
docker image prune -f
docker network prune -f
docker builder prune -f
echo ""
echo " After Cleanup "
docker system df
else
echo " Would Remove "
echo "Stopped containers: $(docker ps -aq -f status=exited | wc -l)"
echo "Dangling images: $(docker images -f dangling=true -q | wc -l)"
echo "Unused networks: $(docker network ls -f dangling=true -q 2>/dev/null | wc -l)"
echo ""
echo "Run with --execute to perform cleanup"
echo "NOTE: Volumes are NOT pruned by this script (data safety)"
fi
Usage:
# Preview what would be cleaned
bash cleanup.sh
# Actually clean
bash cleanup.sh --execute
Container Resource Snapshot
Capture a point-in-time resource report:
#!/usr/bin/env bash
set -euo pipefail
REPORT_FILE="docker-report-$(date +%Y%m%d-%H%M%S).txt"
{
echo "=== Docker Resource Report ==="
echo "Generated: $(date)"
echo "Host: $(hostname)"
echo ""
echo " Docker Version "
docker version --format '{{.Server.Version}}'
echo ""
echo " Disk Usage "
docker system df
echo ""
echo " Running Containers "
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}\t{{.Ports}}'
echo ""
echo " Resource Usage "
docker stats --no-stream --format 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}'
echo ""
echo " Images "
docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedSince}}'
echo ""
echo " Volumes "
docker volume ls
} > "$REPORT_FILE"
echo "Report saved to: $REPORT_FILE"
Scheduling with Cron
# Edit crontab
crontab -e
# Health check every 5 minutes
*/5 * * * * /opt/scripts/docker-health.sh >> /var/log/docker-health.log 2>&1
# Disk monitor every hour
0 * * * * /opt/scripts/docker-disk.sh >> /var/log/docker-disk.log 2>&1
# Safe cleanup weekly (Sunday 3 AM)
0 3 * * 0 /opt/scripts/docker-cleanup.sh --execute >> /var/log/docker-cleanup.log 2>&1
# Resource report daily
0 6 * * * /opt/scripts/docker-report.sh
Key Takeaways
- Use dry-run mode for cleanup scripts before executing in production.
- Schedule health checks and disk monitoring with cron.
- Never auto-prune volumes -- the cleanup script above intentionally skips them.
- Save resource reports for trend analysis and capacity planning.
What's Next
- Continue to Python Audit and Reporting.