docker-cleanup.sh
Безопасная очистка Docker: удаляет остановленные контейнеры, неиспользуемые образы и осиротевшие volumes. Перед удалением показывает, что именно будет убрано, и ждёт подтверждения.
Зависимости
docker
Использование
chmod +x docker-cleanup.sh # Интерактивный режим (с подтверждением) ./docker-cleanup.sh # Автоматический режим (для cron) ./docker-cleanup.sh --force
Код
#!/usr/bin/env bash
set -euo pipefail
# docker-cleanup.sh — безопасная очистка Docker
FORCE="${1:-}"
echo "=== Docker Cleanup ==="
echo ""
# Остановленные контейнеры
STOPPED=$(docker ps -aq --filter status=exited 2>/dev/null | wc -l || echo 0)
echo "Остановленных контейнеров: $STOPPED"
# Неиспользуемые образы (dangling)
DANGLING=$(docker images -q --filter dangling=true 2>/dev/null | wc -l || echo 0)
echo "Неиспользуемых образов: $DANGLING"
# Осиротевшие volumes
VOLUMES=$(docker volume ls -q --filter dangling=true 2>/dev/null | wc -l || echo 0)
echo "Осиротевших volumes: $VOLUMES"
echo ""
if [ "$STOPPED" -eq 0 ] && [ "$DANGLING" -eq 0 ] && [ "$VOLUMES" -eq 0 ]; then
echo "Нечего удалять. Всё чисто."
exit 0
fi
if [ "$FORCE" != "--force" ]; then
read -rp "Удалить всё перечисленное? [y/N] " CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
echo "Отменено."
exit 0
fi
fi
if [ "$STOPPED" -gt 0 ]; then docker container prune -f; fi
if [ "$DANGLING" -gt 0 ]; then docker image prune -f; fi
if [ "$VOLUMES" -gt 0 ]; then docker volume prune -f; fi
echo ""
echo "Очистка завершена."