检查docker hub上是否已存在image:tag组合

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)

  • 这适用于ECR:`aws ecr describe-images --repository-name <repo> --image-ids imageTag = latest`这将消除制作任何卷曲/授权的需要. (5认同)
  • 非docker.io注册表如何处理? (2认同)
  • @WayNo你用的是什么?请分享文档的链接. (2认同)
  • @WayNo 我已经用 Docker 注册表 v2 的功能更新了帖子。我相信,要在非 docker.io 注册表中使用此功能,您应该执行以下操作:使用从“aws ecr get-login”命令获取的“UNAME”和“UPASS”;和“aws_account_id.dkr.ecr.region.amazonaws.com”作为主机。 (2认同)
  • 这是 AWS ECR 的脚本:https://gist.github.com/1ec2102c8c0d48592750b1f0b5306cc9 (2认同)
  • 在 v2 上,为了避免解析分页标签列表,只需对您关心的标签发出 HEAD 请求: `curl --silent -f --head -lSL https://registry.example.com/v2/$1/manifests /$2 &gt; /dev/null` (2认同)
  • 用我目前正在使用的几个存储库对此进行了测试,据我所知,页面大小参数在超过 ~1400 时停止工作。为什么这些存储库有那么多你问的标签?嗯……这是个好问题。 (2认同)
  • 对于 PowerShell:https://gist.github.com/webbertakken/1789a4683a99e2a62b975ff436a85382 (2认同)

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.

  • 遗憾的是,这仍然是实验性的 (11认同)
  • 实际上,您的第一个命令将覆盖整个配置文件,因此值得通过编辑文件来添加此字符串 (3认同)
  • 懒人的单行:`jq'。+ {"experimental": "enabled"}' &lt; ~/.docker/config.json | 海绵 ~/.docker/config.json` (3认同)
  • 为什么两年后这仍然是实验性的? (3认同)
  • @igagis:根据 Docker 文档,它仍然是实验性的(https://docs.docker.com/engine/reference/commandline/manifest/),但从 Docker 20.10 开始,默认启用实验性功能(https://docs.docker.com/engine/reference/commandline/manifest/)。 docker.com/engine/reference/commandline/cli/#experimental-features)。这可能就是为什么它可以为您工作而无需启用任何功能。 (3认同)
  • 如下面的另一个答案所述,您可以通过使用`DOCKER_CLI_EXPERIMENTAL = enabled`来避免更改docker配置文件。 (2认同)
  • @MarkTickner 更遗憾的是它仍然不起作用(我得到清单未找到,而拉取图像)。 (2认同)
  • 看起来已经是非实验性的了。我新安装了 docker,并且没有启用任何实验性的东西,它对我有用。 (2认同)
  • @lanoxx 这似乎是 Artifactory 的问题,甚至是您的 Artifactory 实例的问题。服务器应该用适当的错误代码进行回答:https://docs.docker.com/engine/api/v1.41/ 因此,由于某种原因,您的服务器似乎彻底思考了它的答案。也许某些 2FA 问题或代理功能会等待辅助服务器直到超时。 (2认同)

may*_*xit 15

最简单:

docker pull alpine:invalid > /dev/null && echo "success" || echo "failed"
Run Code Online (Sandbox Code Playgroud)

如果图像存在则拉取并打印成功,如果不存在则打印失败

如果在 bash 脚本中使用,您甚至可以将其导出到 var 中:

在此处输入图片说明

请注意,这将拉取图像(如果存在)。在使用此解决方案之前,请注意管理费用。

  • 请注意,这将拉取容器(如果存在)。为了获取这些信息,即使是拉动小高山也是相当大的开销。更不用说 CI 环境中经常有的几个 GB 图像了。 (7认同)
  • 真的。我完全同意。我在此答案中添加了此信息。感谢您的意见。 (2认同)
  • 这非常适合我的 AWS CodeBuild 层缓存。我只是想尝试拉扯它,我不在乎它是否存在。无论如何它都会被构建并缓存 (2认同)

小智 10

要以morty答案为基础,请注意docker支持使用环境变量设置实验性标志

DOCKER_CLI_EXPERIMENTAL启用cli的实验功能(例如enableddisabled

因此,该代码段变为:

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)

  • 我正在使用 docker cli `Docker version 20.10.7`,看来您不再需要启用 `DOCKER_CLI_EXPERIMENTAL` (4认同)

neo*_*yle 7

我在 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 $?进行验证。

  • 我想知道如何通过休息检查私人存储库中是否存在标签,而无需执行 /v2/imagename/tags/list ,这是完美的答案!由于某种原因,在 stackoverflow 上很难找到这个答案。 (2认同)