![](/img/trans.png)
[英]How to check if particular Docker image exists on IBM container registry
[英]How do I check if an image:tag exists in gitlab container registry
我知道這可以用dockerhub
來完成。 我想知道 gitlab 注冊表是否有類似的東西。
用例是,我編寫了一個結構腳本來將部署恢復為用戶提供的特定標簽。 在實際拉入圖像之前,我想知道注冊表中是否存在具有指定標簽的圖像並相應地警告用戶。
我在他們的文檔中搜索過,但找不到任何東西。
注意:這里的用戶是部署代碼的人。
更新:我添加了一個解決方案,該解決方案無需訪問下面的 docker 服務器(非特權模式)即可工作。
好的,這是我通過啟用實驗性客戶端功能使用 docker:stable 圖像提出的解決方案。
mkdir -p ~/.docker
"echo '{\"experimental\": \"enabled\"}' > ~/.docker/config.json"
docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
docker manifest inspect $IMGNAME:$IMGTAG > /dev/null && exit || true
如果該標簽已存在,則exit
將終止構建腳本。 另外你應該知道~/.docker/config.json
被覆蓋了。 這也是為什么必須在之后登錄的原因。
更新:除了寫入配置之外,還可以將DOCKER_CLI_EXPERIMENTAL
環境變量設置為enabled
。 因此前兩行可以替換為export DOCKER_CLI_EXPERIMENTAL=enabled
更新:如果您沒有打開特權模式,因此無法訪問 docker-daemon,您可以使用harbor提供的registry-api腳本(注意它們是python2。)。 如果您使用kaniko構建 docker 映像,這會很方便,不需要訪問 docker-daemon。
可以使用 Gitlab API。
tag=tag_name
image=image_name
private_token=gitlab_private_token
project=project_number
repo_id=$(curl --header "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$project/registry/repositories" | jq -c --arg regex ".*\\$image$" '.[] | select(.path | test($regex))'.id)
if [ $( curl --header "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$project/registry/repositories/$repo_id/tags/$tag" | jq -r '.name' ) == "$tag" ] ; then
echo "$tag exists"
else
echo "$tag does not exist"
fi
除非GitLab 容器注冊表支持curl dockerhub 所做的那種(使用v1/repositories/$1/tags/$2
),否則我懷疑它是否提供了該功能。
例如,問題 26866“GitLab 注冊表可用圖像列表/搜索”在 10 個月后仍然打開。
GitLab 12.2 更新(2019 年 4 月,18 個月后)
在完成實現之后,創建兩個端點是有意義的:
GET /groups/:id/registry/repositories
- 返回組內所有項目的所有 Docker 容器存儲庫的列表,類似於GET /projects/:id/registry/repositories
和
GET /groups/:id/registry/repositories/tags
- 返回組內所有項目的所有 Docker 容器存儲庫的列表,包括每個容器存儲庫的所有標簽。 響應將如下所示:
這樣可以幫助檢查image:tag
是否存在。
使用搜索快速查找和發現托管在 GitLab 容器注冊表中的圖像
當您或您團隊中的某個人將映像發布到 GitLab 容器注冊表時,您需要一種快速找到它並確保正確構建映像的方法。
如果您使用 GitLab CI/CD 發布每個構建的圖像,則很難在當前用戶界面中有效地找到圖像。 相反,您依賴的是命令行或 API。我們很高興地宣布,在 13.0 中,我們為 GitLab Container Registry 添加了搜索功能。
只需導航到您的項目或組的注冊表並輸入圖像名稱即可查看所有圖像的列表。
另請參閱GitLab 14.7 (2022 年 1 月)
在 Container Registry 瀏覽器中對 Docker 標記進行排序
您現在可以按名稱對 Container Registry 標記詳細信息頁面中的標記列表進行排序。
以前,沒有排序功能。 這有時需要您滾動瀏覽許多頁面才能找到特定標簽。
默認情況下,標簽列表現在按名稱升序排序。 您也可以將排序順序更改為降序。
請參閱此問題以跟蹤有關標簽排序的任何進一步工作。
因此,除了@fparaggio 答案之外,我還在尋找當前分支的圖像是否存在,如果存在則使用分支圖像,否則使用最新標簽作為基礎圖像
package:
stage: package
image:
name: registry.gitlab.com/org/hak:kaniko-debug
entrypoint: [""]
retry:
max: 2
tags:
- kubernetes
interruptible: true
script:
- if [[ $( curl --insecure --header "PRIVATE-TOKEN:$GITLAB_TOKEN" https://gitlab.com/api/v4/projects/xxx/registry/repositories/xxx/tags/$CI_COMMIT_REF_SLUG | jq -r '.name' ) == "$CI_COMMIT_REF_SLUG" ]] ; then
echo "$CI_COMMIT_REF_SLUG exists";
export CODE_VERSION=$CI_COMMIT_REF_SLUG;
else
echo "tag for the branch $CI_COMMIT_REF_SLUG => $CI_COMMIT_REF_NAME does not exist, using latest";
export CODE_VERSION="latest";
fi
然后將CODE_VERSION
作為 docker build args 傳遞
- /kaniko/executor
--build-arg CACHE_IMAGE=$CI_REGISTRY_IMAGE/install
--build-arg CODE_VERSION=$CODE_VERSION
--dockerfile $CI_PROJECT_DIR/Dockerfile-release
--destination $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
您可以在 Gitlab UI 中找到注冊表 ID,無需進行兩次 API 調用。
https://gitlab.com/org/xyz/repository/container_registry/xxx
起重機是一種可能會有所幫助的工具。 下面是一個示例,其中crane manifest
在 Gitlab CI/CD 管道( .gitlab-ci.yml文件)中使用。
check_if_image_exists:
stage: check_if_image_exists
image:
name: gcr.io/go-containerregistry/crane:debug
entrypoint: [""]
script:
- crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- if crane manifest $CI_REGISTRY_IMAGE/image:tag; then echo "exists"; else echo "not exists"; fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.