sudo tee /usr/local/sbin/cleanup-gitlab-runner-docker >/dev/null <<'EOF'
#!/usr/bin/env bash
set -Eeuo pipefail
LOCK_FILE="/run/lock/gitlab-runner-docker-cleanup.lock"
# Не запускать две очистки одновременно.
exec 9>"${LOCK_FILE}"
flock -n 9 || exit 0
echo "=== GitLab Runner Docker cleanup ==="
echo "Time: $(date -Is)"
# Ничего не удалять, пока работает хотя бы один контейнер GitLab Runner.
if docker ps \
--format '{{.Names}}' |
grep -q '^runner-'
then
echo "Active GitLab Runner containers found."
echo "Cleanup skipped."
exit 0
fi
echo
echo "Disk usage before cleanup:"
df -h /
docker system df
echo
echo "Removing stopped GitLab Runner containers..."
mapfile -t RUNNER_CONTAINERS < <(
docker ps -aq \
--filter 'name=runner-'
)
if [ "${#RUNNER_CONTAINERS[@]}" -gt 0 ]; then
docker rm -f "${RUNNER_CONTAINERS[@]}" || true
else
echo "No stopped runner containers."
fi
echo
echo "Removing unused GitLab Runner volumes..."
mapfile -t RUNNER_VOLUMES < <(
docker volume ls -q |
grep '^runner-' || true
)
if [ "${#RUNNER_VOLUMES[@]}" -gt 0 ]; then
for volume in "${RUNNER_VOLUMES[@]}"; do
echo "Removing volume: ${volume}"
docker volume rm "${volume}" || true
done
else
echo "No runner volumes."
fi
echo
echo "Removing Docker build cache..."
docker builder prune -af || true
echo
echo "Removing dangling images..."
docker image prune -f || true
echo
echo "Removing unused networks..."
docker network prune -f || true
echo
echo "Disk usage after cleanup:"
df -h /
docker system df
echo
echo "Cleanup completed."
EOF
sudo chmod +x /usr/local/sbin/cleanup-gitlab-runner-docker
sudo docker ps \
--format 'table {{.ID}}\t{{.Names}}\t{{.Status}}'
df -h /
sudo docker system df -v
sudo du -sh /var/lib/docker/volumes