- 컨테이너 레지스트리의 가시성 변경
- 컨테이너 레지스트리 페이징
- 레지스트리 리포지터리 디렉터리
- 단일 리포지터리의 자세한 내용 가져오기
- 레지스트리 리포지터리 삭제
- 레지스트리 리포지터리 태그 디렉터리
- 레지스트리 리포지터리 태그의 세부 정보 가져오기
- 레지스트리 리포지터리 태그 삭제
- 대량으로 레지스트리 리포지터리 태그 삭제
- 인스턴스 전역 엔드포인트
컨테이너 레지스트리 API
이 API 엔드포인트를 사용하여 GitLab 컨테이너 레지스트리와 작업할 수 있습니다.
$CI_JOB_TOKEN
변수를 JOB-TOKEN
헤더로 전달하여 CI/CD 작업에서 이 엔드포인트로 인증할 수 있습니다. 작업 토큰은 생성한 파이프라인의 프로젝트의 컨테이너 레지스트리에만 액세스할 수 있습니다.
컨테이너 레지스트리의 가시성 변경
이를 사용하여 컨테이너 레지스트리를 볼 수 있는 사용자를 제어할 수 있습니다.
PUT /projects/:id/
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
id
| 정수/문자열 | 예 | 인증된 사용자가 액세스할 수 있는 프로젝트의 ID 또는 URL 인코딩된 경로 |
container_registry_access_level
| 문자열 | 아니요 | 원하는 컨테이너 레지스트리의 가시성. enabled (기본값), private , 또는 disabled 중 하나입니다.
|
container_registry_access_level
의 가능한 값에 대한 설명:
- enabled (기본값): 컨테이너 레지스트리는 프로젝트에 액세스할 수 있는 모든 사람에게 표시됩니다. 프로젝트가 공개되면 컨테이너 레지스트리도 공개됩니다. 프로젝트가 내부 또는 비공개인 경우 컨테이너 레지스트리도 내부 또는 비공개가 됩니다.
- private: 컨테이너 레지스트리는 Reporter 역할 이상의 프로젝트 멤버만 볼 수 있습니다. 이 동작은 가시성이 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": "프로젝트 5",
"container_registry_access_level": "private",
...
}
컨테이너 레지스트리 페이징
기본적으로 GET
요청은 페이징되기 때문에 한 번에 20개의 결과를 반환합니다.
레지스트리 리포지터리 디렉터리
프로젝트 내에서
프로젝트 내의 레지스트리 리포지터리 디렉터리을 가져옵니다.
GET /projects/:id/registry/repositories
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
id
| 정수/문자열 | 예 | 인증된 사용자가 액세스할 수 있는 프로젝트의 ID 또는 URL 인코딩된 경로 |
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에서
tags
및tag_count
속성이 제거되었습니다.
그룹 내의 레지스트리 리포지터리 디렉터리을 가져옵니다.
GET /groups/:id/registry/repositories
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
id
| 정수/문자열 | 예 | 인증된 사용자가 액세스할 수 있는 그룹의 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
| 정수/문자열 | 예 | 인증된 사용자가 액세스할 수 있는 레지스트리 리포지터리의 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
| 정수/문자열 | 예 | 인증된 사용자가 소유한 프로젝트의 ID 또는 URL-encoded path |
repository_id
| 정수 | 예 | 레지스트리 리포지터리의 ID |
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.example.com/api/v4/projects/5/registry/repositories/2"
레지스트리 리포지터리 태그 디렉터리
프로젝트 내에서
- GitLab.com 전용으로 도입된 Keyset 페이지네이션
지정된 레지스트리 리포지터리의 태그 디렉터리을 가져옵니다.
GET /projects/:id/registry/repositories/:repository_id/tags
속성 | 유형 | 필요 여부 | 설명 |
---|---|---|---|
id
| 정수/문자열 | 예 | 인증된 사용자가 액세스할 수 있는 프로젝트의 ID 또는 URL-encoded path |
repository_id
| 정수 | 예 | 레지스트리 리포지터리의 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
| 정수/문자열 | 예 | 인증된 사용자가 액세스할 수 있는 프로젝트의 ID 또는 URL-encoded path |
repository_id
| 정수 | 예 | 레지스트리 리포지터리의 ID |
tag_name
| 문자열 | 예 | 태그의 이름 |
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-encoded path |
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"
이 작업은 블롭을 삭제하지 않습니다. 디스크 공간을 재활용하려면 garbage collection을 실행하십시오.
대량으로 레지스트리 리포지터리 태그 삭제
지정된 기준에 따라 대량으로 레지스트리 리포지터리 태그를 삭제합니다.
개요는 컨테이너 레지스트리 API를 사용하여 *를 제외한 모든 태그를 삭제를 참조하십시오.
DELETE /projects/:id/registry/repositories/:repository_id/tags
속성 | 유형 | 필요 여부 | 설명 |
---|---|---|---|
id
| 정수/문자열 | 예 | 인증된 사용자가 소유한 프로젝트의 ID 또는 URL-encoded path |
repository_id
| 정수 | 예 | 레지스트리 리포지터리의 ID |
name_regex
| 문자열 | 아니요 | 삭제할 이름의 re2 정규 표현식. 모든 태그를 삭제하려면 .* 을 지정합니다. 참고: name_regex 은 name_regex_delete 로 대체되었습니다. 이 필드는 유효성이 검증됩니다.
|
name_regex_delete
| 문자열 | 예 | 삭제할 이름의 re2 정규 표현식. 모든 태그를 삭제하려면 .* 을 지정합니다. 이 필드는 유효성이 검증됩니다.
|
name_regex_keep
| 문자열 | 아니요 | 유지할 이름의 re2 정규 표현식. 이 값은 name_regex_delete 에서 일치하는 것을 재정의합니다. 이 필드는 유효성이 검증됩니다. 참고: .* 로 설정하면 작동하지 않습니다.
|
keep_n
| 정수 | 아니요 | 유지할 주어진 이름의 최신 태그 수 |
older_than
| 문자열 | 아니요 | 인간이 읽을 수 있는 형식인 주어진 시간 이전에 삭제할 태그. 1h , 1d , 1month 와 같은 형식입니다.
|
이 API는 성공하면 HTTP 응답 상태 코드 202를 반환하며 다음 작업을 실행합니다.
- 모든 태그를 생성 날짜순으로 정렬합니다. 생성 날짜는 manifest 생성 시간이며 태그 푸시 시간이 아닙니다.
- 지정된
name_regex_delete
(또는 더이상 사용되지 않는name_regex
)과 일치하는 태그만 삭제하고name_regex_keep
과 일치하는 태그를 유지합니다. -
latest
라는 이름의 태그는 결코 삭제하지 않습니다. - 주어진
keep_n
이 지정된 경우 가장 최신의 매치하는 태그를 유지합니다. - 주어진
older_than
이 지정된 경우 주어진 시간보다 오래된 태그만 삭제합니다. - 비동기 작업을 백그라운드에서 실행하도록 예약합니다.
이러한 작업은 비동기적으로 실행되고 실행되는 데 시간이 걸릴 수 있습니다. 지정된 컨테이너 리포지터리에 대해 한 시간에 한 번 이상 실행할 수 없습니다. 이 작업은 블롭을 삭제하지 않습니다. 디스크 공간을 재활용하려면 garbage collection을 실행하십시오.
예시:
-
정규식 (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을 사용할 때 GitLab Rails 백엔드에서 올바르게 처리되려면 정규 표현식에 포함된 +
문자는 URL 인코딩되어야 합니다. 예를 들어:
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에서 토큰 가져오기
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":" ... "}
참조로 이미지 태그 삭제
DELETE http(s)://${CI_REGISTRY}/v2/${CI_REGISTRY_IMAGE}/tags/reference/${CI_COMMIT_SHORT_SHA}
미리 정의된 CI_REGISTRY_USER
및 CI_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