Skip to content

Instantly share code, notes, and snippets.

@SirUli
Forked from Hermsi1337/hermsi-docker-gc.sh
Created October 30, 2022 09:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SirUli/54886088a4a3c3942998d7d5c49f260b to your computer and use it in GitHub Desktop.
Save SirUli/54886088a4a3c3942998d7d5c49f260b to your computer and use it in GitHub Desktop.
Docker Cleanup Script for Gitlab-Runners
#!/usr/bin/env bash
if [[ -n "${DEBUG}" ]]; then
set -x
fi
# Run container removal
CONTAINER_NAMES_TO_EXCLUDE=()
CONTAINER_NAMES_TO_EXCLUDE+=("gitlab-runner")
docker container ps -aq | while read ROW_CONTAINER_ID ; do
ROW="$(docker ps -a | grep "${ROW_CONTAINER_ID}")"
# check if container name is excluded
for i in "${CONTAINER_NAMES_TO_EXCLUDE[@]}"; do
if echo "${ROW}" | grep -q "${i}"; then continue 2; fi
done
# if the container is exited, remove it
if [[ "$(docker container inspect "${ROW_CONTAINER_ID}" --format "{{.State.Status}}")" != "running" ]]; then
docker container rm "${ROW_CONTAINER_ID}"
continue
fi
# if the container is running seconds or minutes (<60), then skip
if echo "${ROW}" | egrep -i "up\s[0-9]+\s(seconds|minutes)" ; then
continue
fi
# if the container is running longer than an hour, kill it with fire
docker container stop "${ROW_CONTAINER_ID}" || continue
docker container rm "${ROW_CONTAINER_ID}" || continue
done
# Run volume removal
VOLUME_NAMES_TO_EXCLUDE=()
docker volume ls -q | while read ROW_VOLUME_NAME ; do
ROW="$(docker volume ls | grep "${ROW_VOLUME_NAME}")"
# check if volume name is excluded
for i in "${VOLUME_NAMES_TO_EXCLUDE[@]}"; do
if echo "${ROW}" | grep -q "${i}"; then continue 2; fi
done
# remove the volume and skip on error (e.g. when the volume is attached)
docker volume rm "${ROW_VOLUME_NAME}" || continue
done
# Run image removal
IMAGE_NAMES_TO_EXCLUDE=()
IMAGE_NAMES_TO_EXCLUDE+=("gitlab/gitlab-runner")
docker image ls -q | while read ROW_IMAGE_NAME ; do
ROW="$(docker image ls | grep "${ROW_IMAGE_NAME}")"
# check if image name is excluded
for i in "${IMAGE_NAMES_TO_EXCLUDE[@]}"; do
if echo "${ROW}" | grep -q "${i}"; then continue 2; fi
done
# if the image is not older then a week, skip
if ! echo "${ROW}" | egrep -i "[0-9]+\s(week|month|year)s?\sago" ; then
continue
fi
# remove the image and skip on error (e.g. when the image is still used)
# we need to use -f here because some images can't be deleted due to parent-image-construct-foo
docker image rm -f "${ROW_IMAGE_NAME}" || continue
done
## also remove all dangling images
docker image prune -f
# Run network removal
NETWORK_NAMES_TO_EXCLUDE=()
docker network ls -q | while read ROW_NETWORK_ID ; do
ROW="$(docker network ls | grep "${ROW_NETWORK_ID}")"
# check if image name is excluded
for i in "${NETWORK_NAMES_TO_EXCLUDE[@]}"; do
if echo "${ROW}" | grep -q "${i}"; then continue 2; fi
done
# remove the network and skip on error (e.g. when the network is still used)
docker network rm "${ROW_NETWORK_ID}" || continue
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment