簡體   English   中英

Docker Registry - 如果標簽已經存在,則不允許推送(:latest 標簽除外)

[英]Docker Registry - Do not allow pushing if the tag already exits (except for :latest tag)

我有一個場景,我們需要我們的私有 Docker Registry (v2) 不接受推送到標簽(如果它已經存在)。

例如我有

192.168.0.77:5000/my-project:1.0.0

並且有人在上面的端點上推送更新。 它應該停止推動。

然后當用戶使用標簽 1.0.1 或任何其他標簽推送時,它將推送成功。

我知道 Docker 允許推送相同的標簽,但是我希望擁有這種工作流程,因此我們不會以這種方式覆蓋彼此的圖像,而且這些將與 Jenkins 構建相關(用於事務目的)。

部署說明(在 bash 中)

 docker login -u admin -p fakepassword 192.168.0.77:5000
 docker tag my-project 192.168.0.77:5000/my-project:1.0.0
 docker push 192.168.0.77:5000/my-project:1.0.0

有人可以建議實現這一目標的方法嗎?

這就是我在 CI 管道中使用的。

檢查$? ,其中包含最新命令的結果-在您的情況下,該命令檢查標簽是否已存在:

#!/bin/bash

docker manifest inspect $IMGNAME:$IMGTAG
RESULT=$?
if [ $RESULT == 0 ]; then
  echo success
else
  echo failed
fi

將其保存為文件並將其命名為script.sh

運行腳本: sh ./script.sh

如果命令成功,腳本將返回“成功”,否則將返回“失敗”

您正在尋找的術語是不可變標簽或標簽鎖定。 這是注冊服務器的一項功能。 如果您信任推送到注冊表的工具,那么您可以使用各種工具檢查現有標簽:

  • docker manifest inspect (我不確定這是否總是遠程拉取,將其視為實驗性的)
  • docker buildx imagetools inspect (這個命令是隱藏的,這可能意味着它將來會改變)
  • 起重機(來自 Google 的 go-containerregistry)
  • regctl 圖像摘要(來自我自己,摘要執行 HEAD 請求,這對於速率限制請求的注冊表來說更快更好)
  • skopeo(來自 RedHat)

對於這些中的每一個,您都在尋找在標簽丟失並且不關心輸出時觸發的錯誤條件:

if regctl image digest ${some_image} >/dev/null 2>&1; then
  echo image exists, skip push
else
  echo image missing, push new tag
fi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM