Skip to main content

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