컨테이너 레지스트리 API

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

이 API 엔드포인트를 사용하여 GitLab 컨테이너 레지스트리에서 작업합니다.

CI/CD 작업에서 $CI_JOB_TOKEN 변수를 JOB-TOKEN 헤더로 전달하여 이 엔드포인트에서 인증할 수 있습니다. 작업 토큰은 파이프라인을 생성한 프로젝트의 컨테이너 레지스트리에만 접근할 수 있습니다.

컨테이너 레지스트리 가시성 변경

이 설정은 누가 컨테이너 레지스트리를 볼 수 있는지를 제어합니다.

PUT /projects/:id/
속성 유형 필수 설명
id integer/string 인증된 사용자가 접근할 수 있는 프로젝트의 ID 또는 URL-인코딩된 경로입니다.
container_registry_access_level string 아니오 컨테이너 레지스트리의 원하는 가시성입니다. enabled (기본값), private, 또는 disabled 중 하나입니다.

container_registry_access_level에 대한 가능한 값의 설명:

  • enabled (기본값): 컨테이너 레지스트리가 프로젝트에 접근할 수 있는 모든 사람에게 보입니다.
    프로젝트가 공개일 경우, 컨테이너 레지스트리도 공개입니다. 프로젝트가 내부 또는 비공개인 경우, 컨테이너 레지스트리도 내부 또는 비공개입니다.

  • private: 컨테이너 레지스트리는 리포터 역할 이상의 프로젝트 구성원에게만 보입니다. 이 동작은 컨테이너 레지스트리 가시성이 enabled로 설정된 비공개 프로젝트와 유사합니다.

  • disabled: 컨테이너 레지스트리가 비활성화됩니다.

이 설정이 사용자에게 부여하는 권한에 대한 자세한 내용은 컨테이너 레지스트리 가시성 권한을 참조하세요.

curl --request PUT "https://gitlab.example.com/api/v4/projects/5/" \
     --header 'PRIVATE-TOKEN: <your_access_token>' \
     --header 'Accept: application/json' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "container_registry_access_level": "private"
     }'

예제 응답:

{
  "id": 5,
  "name": "Project 5",
  "container_registry_access_level": "private",
  ...
}

컨테이너 레지스트리 페이지네이션

기본적으로 GET 요청은 API 결과가 페이지네이션되어 있기 때문에 한 번에 20개의 결과를 반환합니다.

레지스트리 리포지토리 목록

프로젝트 내에서

프로젝트의 레지스트리 리포지토리 목록을 가져옵니다.

GET /projects/:id/registry/repositories
속성 유형 필수 설명
id integer/string 인증된 사용자가 접근할 수 있는 프로젝트의 ID 또는 URL-인코딩된 경로입니다.
tags boolean 아니오 매개변수가 true로 포함될 경우, 각 리포지토리는 응답에 "tags" 배열을 포함합니다.
tags_count boolean 아니오 매개변수가 true로 포함될 경우, 각 리포지토리는 응답에 "tags_count"를 포함합니다.
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/registry/repositories"

예제 응답:

[
  {
    "id": 1,
    "name": "",
    "path": "group/project",
    "project_id": 9,
    "location": "gitlab.example.com:5000/group/project",
    "created_at": "2019-01-10T13:38:57.391Z",
    "cleanup_policy_started_at": "2020-01-10T15:40:57.391Z",
    "status": null
  },
  {
    "id": 2,
    "name": "releases",
    "path": "group/project/releases",
    "project_id": 9,
    "location": "gitlab.example.com:5000/group/project/releases",
    "created_at": "2019-01-10T13:39:08.229Z",
    "cleanup_policy_started_at": "2020-08-17T03:12:35.489Z",
    "status": "delete_ongoing"
  }
]

그룹 내에서

  • GitLab 15.0에서 tagstag_count 속성이 제거됨.

그룹에서 레지스트리 리포지토리 목록을 가져옵니다.

GET /groups/:id/registry/repositories
속성 유형 필수 설명
id integer/string 인증된 사용자가 접근할 수 있는 그룹의 ID 또는 URL 인코딩된 경로.
curl --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.example.com/api/v4/groups/2/registry/repositories"

예시 응답:

[
  {
    "id": 1,
    "name": "",
    "path": "group/project",
    "project_id": 9,
    "location": "gitlab.example.com:5000/group/project",
    "created_at": "2019-01-10T13:38:57.391Z",
    "cleanup_policy_started_at": "2020-08-17T03:12:35.489Z"
  },
  {
    "id": 2,
    "name": "",
    "path": "group/other_project",
    "project_id": 11,
    "location": "gitlab.example.com:5000/group/other_project",
    "created_at": "2019-01-10T13:39:08.229Z",
    "cleanup_policy_started_at": "2020-01-10T15:40:57.391Z"
  }
]

단일 리포지토리의 세부정보 가져오기

레지스트리 리포지토리의 세부정보를 가져옵니다.

GET /registry/repositories/:id
속성 유형 필수 설명
id integer/string 인증된 사용자가 접근할 수 있는 레지스트리 리포지토리의 ID.
tags boolean 아니오 매개변수가 true로 포함되면 응답에 "tags" 배열이 포함됩니다.
tags_count boolean 아니오 매개변수가 true로 포함되면 응답에 "tags_count"가 포함됩니다.
size boolean 아니오 매개변수가 true로 포함되면 응답에 "size"가 포함됩니다. 이는 리포지토리 내 모든 이미지의 중복되지 않은 크기입니다. 중복 제거는 동일한 데이터의 추가 복사본을 제거합니다. 예를 들어, 동일한 이미지를 두 번 업로드하면 컨테이너 레지스트리는 하나의 복사본만 저장합니다. 이 필드는 2021-11-04 이후에 생성된 리포지토리에 대해 GitLab.com에서만 사용할 수 있습니다.
curl --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.example.com/api/v4/registry/repositories/2?tags=true&tags_count=true&size=true"

예시 응답:

{
  "id": 2,
  "name": "",
  "path": "group/project",
  "project_id": 9,
  "location": "gitlab.example.com:5000/group/project",
  "created_at": "2019-01-10T13:38:57.391Z",
  "cleanup_policy_started_at": "2020-08-17T03:12:35.489Z",
  "tags_count": 1,
  "tags": [
    {
      "name": "0.0.1",
      "path": "group/project:0.0.1",
      "location": "gitlab.example.com:5000/group/project:0.0.1"
    }
  ],
  "size": 2818413,
  "status": "delete_scheduled"
}

레지스트리 리포지토리 삭제

레지스트리에서 리포지토리를 삭제합니다.

이 작업은 비동기로 실행되며 실행되는 데 시간이 걸릴 수 있습니다.

DELETE /projects/:id/registry/repositories/:repository_id
속성 유형 필수 설명
id integer/string 프로젝트의 ID 또는 URL-인코딩 경로입니다.
repository_id integer 레지스트리 리포지토리의 ID입니다.
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2"

레지스트리 리포지토리 태그 목록

프로젝트 내에서

  • GitLab 16.10에 도입된 키셋 페이지네이션은 GitLab.com에서만 사용할 수 있습니다.

주어진 레지스트리 리포지토리에 대한 태그 목록을 가져옵니다.

GET /projects/:id/registry/repositories/:repository_id/tags
속성 유형 필수 설명
id integer/string 인증된 사용자가 접근할 수 있는 프로젝트의 ID 또는 URL-인코딩 경로입니다.
repository_id integer 레지스트리 리포지토리의 ID입니다.
curl --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2/tags"

예제 응답:

[
  {
    "name": "A",
    "path": "group/project:A",
    "location": "gitlab.example.com:5000/group/project:A"
  },
  {
    "name": "latest",
    "path": "group/project:latest",
    "location": "gitlab.example.com:5000/group/project:latest"
  }
]

레지스트리 리포지토리 태그 세부정보 가져오기

레지스트리 리포지토리 태그의 세부정보를 가져옵니다.

GET /projects/:id/registry/repositories/:repository_id/tags/:tag_name
속성 유형 필수 설명
id integer/string 인증된 사용자가 접근할 수 있는 프로젝트의 ID 또는 URL-인코딩 경로입니다.
repository_id integer 레지스트리 리포지토리의 ID입니다.
tag_name string 태그의 이름입니다.
curl --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2/tags/v10.0.0"

예제 응답:

{
  "name": "v10.0.0",
  "path": "group/project:latest",
  "location": "gitlab.example.com:5000/group/project:latest",
  "revision": "e9ed9d87c881d8c2fd3a31b41904d01ba0b836e7fd15240d774d811a1c248181",
  "short_revision": "e9ed9d87c",
  "digest": "sha256:c3490dcf10ffb6530c1303522a1405dfaf7daecd8f38d3e6a1ba19ea1f8a1751",
  "created_at": "2019-01-06T16:49:51.272+00:00",
  "total_size": 350224384
}

레지스트리 저장소 태그 삭제

레지스트리 저장소 태그를 삭제합니다.

DELETE /projects/:id/registry/repositories/:repository_id/tags/:tag_name
속성 유형 필수 설명
id 정수/문자열 프로젝트의 ID 또는 URL 인코딩된 경로입니다.
repository_id 정수 레지스트리 저장소의 ID입니다.
tag_name 문자열 태그의 이름입니다.
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2/tags/v10.0.0"

이 작업은 블롭을 삭제하지 않습니다. 블롭을 삭제하고 디스크 공간을 재활용하려면, 가비지 수집을 실행하십시오.

레지스트리 저장소 태그 대량 삭제

주어진 기준에 따라 레지스트리 저장소 태그를 대량으로 삭제합니다.

개요는 컨테이너 레지스트리 API를 사용하여 모든 태그 삭제하기를 참조하세요.

DELETE /projects/:id/registry/repositories/:repository_id/tags
속성 유형 필수 설명
id 정수/문자열 프로젝트의 ID 또는 URL 인코딩된 경로입니다.
repository_id 정수 레지스트리 저장소의 ID입니다.
name_regex 문자열 아니오 삭제할 이름의 re2 정규 표현식입니다. 모든 태그를 삭제하려면 .*를 지정합니다. 참고: name_regexname_regex_delete로 대체되어 사용되지 않습니다. 이 필드는 검증됩니다.
name_regex_delete 문자열 삭제할 이름의 re2 정규 표현식입니다. 모든 태그를 삭제하려면 .*를 지정합니다. 이 필드는 검증됩니다.
name_regex_keep 문자열 아니오 유지할 이름의 re2 정규 표현식입니다. 이 값은 name_regex_delete에서 일치하는 항목을 오버라이드합니다. 이 필드는 검증됩니다. 참고: .*로 설정하면 아무 동작이 수행되지 않습니다.
keep_n 정수 아니오 유지할 주어진 이름의 최신 태그 수입니다.
older_than 문자열 아니오 주어진 시간보다 오래된 태그를 삭제합니다. 인간이 읽을 수 있는 형식으로 작성됩니다 1h, 1d, 1month.

이 API는 성공 시 HTTP 응답 상태 코드 202를 반환하며, 다음 작업을 수행합니다:

  • 모든 태그를 생성 날짜로 정렬합니다. 생성 날짜는 매니페스트 생성 시간이며, 태그 푸시 시간은 아닙니다.
  • 주어진 name_regex_delete (또는 사용되지 않는 name_regex)와 일치하는 태그만 삭제하고, name_regex_keep과 일치하는 태그는 유지합니다.
  • latest라는 이름의 태그는 절대 삭제하지 않습니다.
  • N개 최신 일치하는 태그를 유지합니다(만약 keep_n이 지정되었다면).
  • X시간보다 오래된 태그만 삭제합니다(만약 older_than이 지정되었다면).
  • 작업을 백그라운드에서 실행되도록 비동기 작업을 예약합니다.

이 작업들은 비동기적으로 실행되며 실행되는 데 시간이 걸릴 수 있습니다.

주어진 컨테이너 저장소에 대해 최대 한 시간에 한 번만 실행할 수 있습니다.

이 작업은 블롭을 삭제하지 않습니다. 블롭을 삭제하고 디스크 공간을 재활용하려면, 가비지 수집을 실행하십시오.

경고: GitLab.com에서는 컨테이너 레지스트리의 규모 때문에 이 API가 삭제하는 태그의 수가 제한됩니다.

컨테이너 레지스트리에 삭제할 태그가 많으면 일부만 삭제되고 이 API를 여러 번 호출해야 할 수 있습니다.

태그의 자동 삭제를 예약하려면 정리 정책을 사용하십시오.

예시:

  • 정규 표현식(Git SHA)와 일치하는 태그 이름을 제거하고 항상 최소 5개를 유지하며, 2일보다 오래된 태그를 제거합니다:

    curl --request DELETE --data 'name_regex_delete=[0-9a-z]{40}' --data 'keep_n=5' --data 'older_than=2d' \
         --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2/tags"
    
  • 모든 태그를 제거하지만 항상 최신 5개를 유지합니다:

    curl --request DELETE --data 'name_regex_delete=.*' --data 'keep_n=5' \
         --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2/tags"
    
  • 모든 태그를 제거하지만 항상 stable로 시작하는 태그를 유지합니다:

    curl --request DELETE --data 'name_regex_delete=.*' --data 'name_regex_keep=stable.*' \
         --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2/tags"
    
  • 1개월보다 오래된 모든 태그를 제거합니다:

    curl --request DELETE --data 'name_regex_delete=.*' --data 'older_than=1month' \
         --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2/tags"
    

cURL에서 + 문자가 포함된 정규 표현식 사용

cURL을 사용할 때, 정규 표현식에 있는 + 문자는 URL 인코딩을 통해 GitLab Rails 백엔드에서 올바르게 처리되도록 해야 합니다. 예를 들면:

curl --request DELETE --data-urlencode 'name_regex_delete=dev-.+' \
     --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/registry/repositories/2/tags"

인스턴스 전체 엔드포인트

위에서 설명한 그룹 및 프로젝트 특정 GitLab API 외에도, 컨테이너 레지스트리는 자체 엔드포인트를 가지고 있습니다.

이를 쿼리하려면 레지스트리의 내장 메커니즘을 따라 인증 토큰을 얻고 사용하세요.

참고: 이는 GitLab 애플리케이션의 프로젝트 또는 개인 액세스 토큰과 다릅니다.

GitLab에서 토큰 얻기

GET ${CI_SERVER_URL}/jwt/auth?service=container_registry&scope=*

유효한 토큰을 검색하려면 올바른 범위 및 작업을 지정해야 합니다:

$ SCOPE="repository:${CI_REGISTRY_IMAGE}:delete" #or push,pull

$ curl  --request GET --user "${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD}" \
        "https://gitlab.example.com/jwt/auth?service=container_registry&scope=${SCOPE}"
{"token":" ... "}

참조로 이미지 태그 삭제

  • 엔드포인트 v2/<name>/manifests/<tag>소개됨 그리고 엔드포인트 v2/<name>/tags/reference/<tag>사용 중단됨 GitLab 16.4에서.
DELETE http(s)://${CI_REGISTRY}/v2/${CI_REGISTRY_IMAGE}/tags/reference/${CI_COMMIT_SHORT_SHA}

위에서 가져온 CI_REGISTRY_USERCI_REGISTRY_PASSWORD 변수를 사용하여 GitLab 인스턴스에서 참조로 컨테이너 이미지 태그를 삭제할 수 있습니다.

tag_delete Container-Registry-Feature가 활성화되어 있어야 합니다.

$ curl  --request DELETE --header "Authorization: Bearer <token_from_above>" \
        --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
        "https://gitlab.example.com:5050/v2/${CI_REGISTRY_IMAGE}/manifests/${CI_COMMIT_SHORT_SHA}"

모든 컨테이너 리포지토리 나열

GET http(s)://${CI_REGISTRY}/v2/_catalog

GitLab 인스턴스에서 모든 컨테이너 리포지토리를 나열하려면 관리자의 자격 증명이 필요합니다:

$ SCOPE="registry:catalog:*"

$ curl  --request GET --user "<admin-username>:<admin-password>" \
        "https://gitlab.example.com/jwt/auth?service=container_registry&scope=${SCOPE}"
{"token":" ... "}

$ curl --header "Authorization: Bearer <token_from_above>" https://gitlab.example.com:5050/v2/_catalog