#!/usr/bin/env bash

set -e
set -o pipefail

LOG_FILE="${HOME}/clean-docker.log"

log() {
	echo "[$(date '+%F %T')] $*"
}

function clean_images() {
	log "1. 清理 aliyun 镜像（老镜像）"

	mapfile -t tags < <(
		docker image ls \
			--filter=reference='*.aliyuncs.com/*/*' \
			--format '{{.Repository}}:{{.Tag}}' |
			grep -v ':<none>$'
	)

	for tag in "${tags[@]}"; do
		log "docker rmi ${tag}"
		docker rmi "${tag}" || true
	done

	log "2. 清理 dangling 镜像"
	docker image prune -f || true

	log "3. 清理未使用镜像（7天前）"
	docker image prune -a -f --filter "until=168h" || true
}

function builder_prune() {
	log "docker builder prune（7天前）"
	docker builder prune -a -f --filter "until=168h" || true
}

function container_prune() {
	log "docker container prune（24h）"
	docker container prune -f --filter "until=24h" || true
}

function volume_prune() {
	log "docker volume prune"
	docker volume prune -f || true
}

function runner_prune() {
	log "gitlab-runner cache prune"
	/usr/share/gitlab-runner/clear-docker-cache prune-volumes || true
}

if [[ -z "$1" ]]; then
	echo "Usage: $0 [images|builder|container|volume|runner]"
	exit 1
fi

exec > >(tee -a "${LOG_FILE}") 2>&1

log "===== 脚本开始 ====="

case "$1" in
images)
	clean_images
	;;
builder)
	builder_prune
	;;
container)
	container_prune
	;;
volume)
	volume_prune
	;;
runner)
	runner_prune
	;;
*)
	log "未知选项 $1"
	log "可选 images builder container volume runner"
	exit 1
	;;
esac

log "----- 脚本结束 -----"
