gpt4 book ai didi

docker - 如何在 docker-compose 中找到更新版本的 docker 镜像的可用性

转载 作者:行者123 更新时间:2023-12-04 11:08:26 25 4
gpt4 key购买 nike

如果您没有使用最新版本的 docker 镜像,如何在包含多个服务的 docker-compose 文件中找到较新版本的 docker 镜像的可用性(类似于 npm outdated, gradlew dependencyUpdates gem outdated )

最佳答案

Docker 镜像不像包管理器那样有版本概念。 Docker 镜像有标签。这些标签可以是图像作者选择的任何内容。一些图像作者可能会发布指示图像中软件版本的标签,而其他图像作者可能只是随着时间的推移将更新的图像推送到同一标签之上。
例如,如果您使用 nginx:mainline在指定图像时标记,它会在您拉取图像时获取当前的 nginx 主线版本。这是由于政策,nginx官方图片发布者有他们标记图片的方式。它们还有特定的版本标签,例如 nginx:1.21.1恰好指向与 nginx:mainline 相同的 blob在写这个答案的时候。
鉴于此特定图像标记策略,您可以设置 docker-compose.yml指向 nginx:mainline并定期运行 docker-compose up --pull -d .这将导致 compose 尝试拉取 nginx:mainline再次镜像,然后循环任何需要循环的容器。如果是较新的 nginx:mainline镜像存在于注册表中,compose 将拉取该新镜像,然后使用新镜像重新创建容器。
docker-compose 本身无法将注册表上的内容与本地 docker 引擎上的内容进行比较。
您可以通过 API 查询注册表以查看给定标签返回的 sha256 摘要,或使用 reg与注册表交互的 CLI 工具:https://github.com/genuinetools/reg
继续 nginx:mainline例如,假设我使用 nginx:mainline 部署了我的撰写文件当时对应的版本是 1.20.0,但现在 1.21.1 已经出来了。我会做以下比较:

docker inspect nginx:mainline --format '{{.Id}}'
这将返回 nginx:mainline 的长 sha256 图像 ID
然后,我可以使用以下命令查询存储库:
reg manifest nginx:mainline
这将返回一个描述图像及其图层的 json 文档。在 config关键,有一个 digest key 。如果这个键匹配,你就知道它是同一个图像。如果不同,您就知道远程副本不同。
您可以使用 jq与此命令结合使用以获得正确的值:
reg manifest nginx:mainline | jq -r .config.digest
这意味着如果我重新运行 docker-compose up --pull -d ,将拉取远程镜像并重新创建我的容器以使用它。
——
如果您使用特定版本标签而不是主线标签,那么您可以编写可用标签的脚本并尝试以编程方式确定是否有新版本。
对于 nginx 存储库,版本特定标签(不包括 -alpine 之类的变体)始终只包含数字和点。因为这是该图像在其标签中进行版本控制的特定策略,所以我可以获得这样的列表并按版本对它们进行排序:
reg tags nginx | grep '^[0-9,\.]*$' | sort -V
我必须确定某种方式将该版本列表与当前版本进行比较,这在堆栈溢出问题中有所涉及: How to compare two strings in dot separated version format in Bash?
当然,这只是基于 docker 官方镜像的镜像标记策略的一个示例,该镜像专门以这种特定模式标记软件的版本。其他图像作者可能有自己的模式,您需要为其实现逻辑。

关于docker - 如何在 docker-compose 中找到更新版本的 docker 镜像的可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68284582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com