개요
- K8S 에 배포를 위하여 Docker image tag명을 변경하면서 배포를 하다보니 많은 이미지들이 쌓이게 되었고 Docker Registry 용량 문제로 image 삭제가 필요해졌습니다. 이를 해결하기위하여 Gitlab-CI를 통해 script를 추가했습니다.
스크립트
현재 사용중인 image tag 구하기
current_image_tag:
...생략...
stage: current_image_tag
image: bitnami/kubectl:latest
script:
- kubectl describe deployment [delpoyment name] -n [namespace] | grep "Image:" | awk '{print $2}' | rev | cut -c 1-8 | rev > current_image_tag.txt
...생략...
- k8s로 접속하여 현재 Deployment 가 사용중인 image를 current_image_tag.txt 에 저장합니다.
현재 사용중인 image tag를 제외하고 모두 삭제하기
prepare_image_delete:
...생략...
stage: prepare_image_delete
image: alpine:latest
script:
...생략...
- curl -s "[url]/tags/list" -u [auth] | grep -o '"tags":\[[^]]*\]' | grep -o '"[^"]*"' | tr -d '"' | tail -n +2 > tags.txt
- tags=$(cat tags.txt)
- |
for TAG in $tags; do
echo $TAG
if [[ "$TAG" != ${currentTag} ]]; then
DIGEST=$(curl -i -H "Accept: application/vnd.docker.distribution.manifest.v2+json" "[url]/manifests/$TAG" -u [auth] | grep Docker-Content-Digest | awk '{print $2}' | tr -d '\r')
curl -s -X DELETE [url]/manifests/${DIGEST} -u [auth]
fi
done
...생략...
- 현재 사용중인 image tag를 제외한 모든 tag를 삭제합니다.
GC를 통해 용량 확보하기
docker exec [registry] bin/registry garbage-collect /etc/docker/registry/config.yml
느낀점
- 작업한 내용을 정리하면서 느꼈지만 script를 나눠서 처리하는것보다 tag list를 가져와서 n개 row까지 자르고 나머지를 삭제하는 로직으로 하였다면 남길수있는 image 갯수를 유연하게 변경이 가능했을텐데 아쉬움이 남는다. 추후에 여유로울때 변경하는 작업을 진행해야겠다.