컨테이너 레지스트리에서 컨테이너 이미지 삭제
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
컨테이너 레지스트리에서 컨테이너 이미지를 삭제할 수 있습니다. 특정 기준에 따라 컨테이너 이미지를 자동으로 삭제하려면 가비지 컬렉션을 사용하세요. 프로젝트 또는 그룹에서 특정 컨테이너 이미지를 삭제하려면 GitLab UI 또는 GitLab API를 사용할 수 있습니다.
컨테이너 레지스트리에서 컨테이너 이미지를 삭제할 수 있습니다.
특정 기준에 따라 컨테이너 이미지를 자동으로 삭제하려면 가비지 컬렉션을 사용하세요. 또는 서드파티 도구를 사용하여 특정 프로젝트에서 컨테이너 이미지를 삭제하는 CI/CD 작업을 생성할 수 있습니다.
프로젝트 또는 그룹에서 특정 컨테이너 이미지를 삭제하려면 GitLab UI 또는 GitLab API를 사용할 수 있습니다.
컨테이너 이미지 삭제는 파괴적인 작업이며 취소할 수 없습니다. 삭제된 컨테이너 이미지를 복원하려면 다시 빌드하고 다시 업로드해야 합니다.
가비지 컬렉션#
GitLab Self-Managed 인스턴스에서 컨테이너 이미지를 삭제해도 스토리지 공간이 확보되지 않으며, 이미지만 삭제 대상으로 표시됩니다. 참조되지 않는 컨테이너 이미지를 실제로 삭제하고 스토리지 공간을 복구하려면 GitLab Self-Managed 인스턴스 관리자가 가비지 컬렉션을 실행해야 합니다.
GitLab.com의 컨테이너 레지스트리에는 자동 온라인 가비지 컬렉터가 포함되어 있습니다. 자동 가비지 컬렉터를 사용하면 참조되지 않은 상태로 남겨진 경우 24시간 후 다음이 자동으로 삭제 예약됩니다:
- 이미지 매니페스트에서 참조하지 않는 레이어.
- 태그가 없고 다른 매니페스트(예: 멀티 아키텍처 이미지)에서 참조하지 않는 이미지 매니페스트.
온라인 가비지 컬렉터는 인스턴스 전체에 적용되는 기능이며 모든 네임스페이스에 적용됩니다.
GitLab UI 사용#
GitLab UI를 사용하여 컨테이너 이미지를 삭제하려면:
-
상단 바에서 검색 또는 이동을 선택하고 프로젝트 또는 그룹을 찾습니다.
-
다음 중 하나에 해당하는 경우:
- 그룹의 경우 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 두 단계를 정의합니다. build_image 잡은 브랜치에 대한 컨테이너 이미지를 빌드하고, delete_image 잡은 이를 삭제합니다. 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 잡에서 정의된 REGCTL_VERSION 변수를 변경하여 코드 예시를 업데이트할 수 있습니다.
정리 정책 사용#
프로젝트별 정리 정책을 생성하여 이전 태그 및 이미지가 컨테이너 레지스트리에서 정기적으로 제거되도록 할 수 있습니다.
