rga*_*eth 30 bash docker dockerhub
作为bash脚本的一部分,我想检查docker hub上是否存在特别的docker image:tag组合.此外,它将是一个私人存储库.
即伪代码如下:
tag = something
if image:tag already exists on docker hub:
Do nothing
else
Build and push docker image with that tag
Run Code Online (Sandbox Code Playgroud)
Evg*_*kin 29
请试试这个
function docker_tag_exists() {
curl --silent -f -lSL https://index.docker.io/v1/repositories/$1/tags/$2 > /dev/null
}
if docker_tag_exists library/nginx 1.7.5; then
echo exist
else
echo not exists
fi
Run Code Online (Sandbox Code Playgroud)
更新:
如果使用Docker Registry v2(基于此):
# set username and password
UNAME="user"
UPASS="password"
function docker_tag_exists() {
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)
EXISTS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/$1/tags/?page_size=10000 | jq -r "[.results | .[] | .name == \"$2\"] | any")
test $EXISTS = true
}
if docker_tag_exists library/nginx 1.7.5; then
echo exist
else
echo not exists
fi
Run Code Online (Sandbox Code Playgroud)
mor*_*rty 22
这是我使用docker使用gitlab的解决方案:稳定的图像.
确保启用了实验性客户端功能:
echo '{"experimental": "enabled"}' > ~/.docker/config.json
Run Code Online (Sandbox Code Playgroud)
这也会覆盖您的配置.如果这不是一个选项,您需要手动或使用DOCKER_CLI_EXPERIMENTAL,enabled或任何可用的.
登录
docker login -u $USER -p $PASSWORD $REGISTRY
Run Code Online (Sandbox Code Playgroud)
检查它是否存在:
docker manifest inspect $IMGNAME:$IMGTAG > /dev/null ; echo $?
Run Code Online (Sandbox Code Playgroud)
docker将在成功时返回0或在失败时返回1.
may*_*xit 15
最简单:
docker pull alpine:invalid > /dev/null && echo "success" || echo "failed"
Run Code Online (Sandbox Code Playgroud)
如果图像存在则拉取并打印成功,如果不存在则打印失败:
如果在 bash 脚本中使用,您甚至可以将其导出到 var 中:
请注意,这将拉取图像(如果存在)。在使用此解决方案之前,请注意管理费用。
小智 10
要以morty的答案为基础,请注意docker支持使用环境变量设置实验性标志:
DOCKER_CLI_EXPERIMENTAL启用cli的实验功能(例如enabled或disabled)
因此,该代码段变为:
tag=something
if DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect $image:$tag >/dev/null; then
Do nothing
else
Build and push docker image with that tag
fi
Run Code Online (Sandbox Code Playgroud)
我在 LAN 上使用registry:2、私有 CA 和基本身份验证建立了一个 docker 私有存储库。
我刚刚查看了官方 docker API 文档(https://docs.docker.com/registry/spec/api/)并提出了这个解决方案,它看起来非常优雅,易于调试、定制,并且 CICD/脚本友好。
curl --silent -i -u "demoadmin":"demopassword" https://mydockerrepo.local:5000/v2/rancher/pause/manifests/3.1 | grep "200 OK"
Run Code Online (Sandbox Code Playgroud)
--silient 去掉一些额外的文本
-i 是显示返回代码“200 OK”的原因
如果存在则返回码为 0,如果不存在则返回码为 1 您可以使用
Bash# echo $?进行验证。