컨테이너 레지스트리에서 컨테이너 이미지 삭제

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

컨테이너 레지스트리에서 컨테이너 이미지를 삭제할 수 있습니다.

특정 기준에 따라 컨테이너 이미지를 자동으로 삭제하려면 garbage collection을 사용하세요.
또는 3rd-party 도구를 사용하여 CI/CD 작업 생성할 수 있습니다
특정 프로젝트에서 컨테이너 이미지를 삭제하는 데 사용할 수 있습니다.

프로젝트 또는 그룹에서 특정 컨테이너 이미지를 삭제하려면 GitLab UI
또는 GitLab API를 사용할 수 있습니다.

caution
컨테이너 이미지를 삭제하는 것은 파괴적인 작업이며 되돌릴 수 없습니다.
삭제된 컨테이너 이미지를 복원하려면 다시 빌드하고 다시 업로드해야 합니다.

Garbage collection

셀프 관리 인스턴스에서 컨테이너 이미지를 삭제해도 저장 공간이 해제되지 않습니다.
이미지를 삭제 가능으로 표시할 뿐입니다.
실제로 참조되지 않는 컨테이너 이미지를 삭제하고 저장 공간을 복구하려면
셀프 관리 인스턴스 관리자가 garbage collection을 실행해야 합니다.

GitLab.com의 컨테이너 레지스트리에는 자동 온라인 쓰레기 수거기가 포함되어 있습니다.
자동 쓰레기 수거기를 사용하면 다음이 참조되지 않을 경우 24시간 후에 자동으로 삭제가 예약됩니다:

  • 어떤 이미지 매니페스트에서도 참조되지 않는 레이어.
  • 태그가 없고 다른 매니페스트(예: 다중 아키텍처 이미지)에서 참조되지 않는 이미지 매니페스트.

온라인 쓰레기 수거기는 인스턴스 전체 기능이며 모든 네임스페이스에 적용됩니다.

GitLab UI 사용

GitLab UI를 사용하여 컨테이너 이미지를 삭제하려면:

  1. 왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트 또는 그룹을 찾습니다.
  2. 다음에 대해:
    • 그룹의 경우, Operate > Container Registry를 선택합니다.
    • 프로젝트의 경우, Deploy > Container Registry를 선택합니다.
  3. Container Registry 페이지에서 삭제할 항목을 선택할 수 있습니다.
    • 빨간 휴지통 아이콘을 선택하여 전체 리포지토리와 그 안의 모든 태그를 삭제합니다.
    • 리포지토리로 이동하여 삭제하려는 태그 옆의 빨간 휴지통 아이콘을 선택하여 개별적으로 또는 일괄 삭제합니다.
  4. 대화 상자에서 Remove tag를 선택합니다.

GitLab API 사용

API를 사용하여 컨테이너 이미지 삭제 프로세스를 자동화할 수 있습니다.
자세한 내용은 다음 엔드포인트를 참조하세요:

GitLab CI/CD 사용

note
GitLab CI/CD는 컨테이너 이미지를 제거하는 내장 방법을 제공하지 않습니다.
이 예시는 GitLab Registry API와 통신하는 regctl이라는 3rd-party 도구를 사용합니다.
이 3rd-party 도구에 대한 지원은 regclient의 이슈 큐를 참조하세요.

다음 예시는 두 개의 단계를 정의합니다: buildclean.
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  
note
최신 regctl 릴리스를 릴리스 페이지에서 다운로드한 다음
delete_image 작업에서 정의된 REGCTL_VERSION 변수를 변경하여 코드 예제를 업데이트하세요.

정리 정책 사용

프로젝트별 정리 정책을 생성하여 오래된 태그와 이미지를 정기적으로 컨테이너 레지스트리에서 제거하도록 할 수 있습니다.