컨테이너 레지스트리에서 컨테이너 이미지 삭제
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
컨테이너 레지스트리에서 컨테이너 이미지를 삭제할 수 있습니다. 특정 기준에 따라 컨테이너 이미지를 자동으로 삭제하려면 가비지 컬렉션을 사용합니다. 프로젝트나 그룹에서 특정 컨테이너 이미지를 삭제하려면 GitLab UI 또는 GitLab API를 사용할 수 있습니다.
컨테이너 레지스트리에서 컨테이너 이미지를 삭제할 수 있습니다.
특정 기준에 따라 컨테이너 이미지를 자동으로 삭제하려면 가비지 컬렉션을 사용합니다. 또는 서드파티 도구를 사용해 특정 프로젝트에서 컨테이너 이미지를 삭제하는 CI/CD job을 생성할 수 있습니다.
프로젝트나 그룹에서 특정 컨테이너 이미지를 삭제하려면 GitLab UI 또는 GitLab API를 사용할 수 있습니다.
컨테이너 이미지 삭제는 파괴적인 작업이며 되돌릴 수 없습니다. 삭제한 컨테이너 이미지를 복원하려면 다시 빌드해서 다시 업로드해야 합니다.
가비지 컬렉션#
GitLab Self-Managed 인스턴스에서 컨테이너 이미지를 삭제해도 스토리지 공간은 확보되지 않으며, 해당 이미지가 삭제 대상으로 표시될 뿐입니다. 참조되지 않는 컨테이너 이미지를 실제로 삭제하고 스토리지 공간을 회수하려면 GitLab Self-Managed 인스턴스 관리자가 가비지 컬렉션을 실행해야 합니다.
GitLab.com의 컨테이너 레지스트리에는 자동 온라인 가비지 컬렉터가 포함되어 있습니다. 자동 가비지 컬렉터를 사용하면 다음 항목이 참조되지 않은 채 남아 있을 때 24시간 후 삭제되도록 자동으로 예약됩니다.
- 어떤 이미지 매니페스트에서도 참조하지 않는 레이어.
- 태그가 없고 다른 매니페스트(예: 멀티 아키텍처 이미지)에서도 참조하지 않는 이미지 매니페스트.
온라인 가비지 컬렉터는 인스턴스 전체에 적용되는 기능이며, 모든 네임스페이스에 적용됩니다.
GitLab UI 사용#
GitLab UI로 컨테이너 이미지를 삭제하려면 다음 단계를 수행합니다.
-
상단 바에서 Search or go to를 선택하고 프로젝트나 그룹을 찾습니다.
-
다음과 같이 이동합니다.
- 그룹은 Operate > Container Registry를 선택합니다.
- 프로젝트는 Deploy > Container Registry를 선택합니다.
-
Container Registry 페이지에서 다음 방법 중 하나로 삭제할 대상을 선택할 수 있습니다.
- 빨간색 [remove] Trash 아이콘을 선택해 리포지터리 전체와 그 안의 모든 태그를 삭제합니다.
- 리포지터리로 이동한 다음 삭제할 태그 옆의 빨간색 [remove] Trash 아이콘을 선택해 태그를 개별로 또는 대량으로 삭제합니다.
-
대화 상자에서 Remove tag를 선택합니다.
10회를 초과해 삭제에 실패한 컨테이너 리포지터리는 이미지 삭제 시도를 자동으로 중단합니다.
GitLab API 사용#
API를 사용해 컨테이너 이미지 삭제 과정을 자동화할 수 있습니다. 자세한 내용은 다음 엔드포인트를 참고합니다.
GitLab CI/CD 사용#
GitLab CI/CD는 컨테이너 이미지를 제거하는 기본 기능을 제공하지 않습니다. 이 예시는 GitLab Registry API와
통신하는 regctl이라는 서드파티 도구를 사용합니다.
이 서드파티 도구에 대한 지원은 regclient 이슈 트래커를 참고합니다.
다음 예시는 build와 clean 두 개의 Stage를 정의합니다. build_image job은 브랜치용 컨테이너
이미지를 빌드하고, delete_image job은 이를 삭제합니다. reg 실행 파일을 내려받아
$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG 미리 정의된 CI/CD 변수와
일치하는 컨테이너 이미지를 제거합니다.
이 예시를 사용하려면 IMAGE_TAG 변수를 필요에 맞게 변경합니다.
stages:
- build
- clean
build_image:
image: docker:20.10.16
stage: build
services:
- docker:20.10.16-dind
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: never
- if: $CI_COMMIT_BRANCH
delete_image:
stage: clean
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
REGCTL_VERSION: v0.6.1
rules:
- if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH
image: alpine:latest
script:
- apk update
- apk add curl
- curl --fail-with-body --location "https://github.com/regclient/regclient/releases/download/${REGCTL_VERSION}/regctl-linux-amd64" > /usr/bin/regctl
- chmod 755 /usr/bin/regctl
- regctl registry login ${CI_REGISTRY} -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD}
- regctl tag rm $IMAGE
릴리스 페이지에서 최신 regctl 릴리스를 내려받은 다음,
delete_image job에 정의된 REGCTL_VERSION 변수를 변경해 코드 예시를 업데이트할 수 있습니다.
정리 정책 사용#
프로젝트별 정리 정책을 만들어 오래된 태그와 이미지가 컨테이너 레지스트리에서 정기적으로 제거되도록 할 수 있습니다.