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

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

回答

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 摘要,或使用regCLI 工具与注册表交互:https : //github.com/genuinetools/reg

继续这个nginx:mainline例子,假设我nginx:mainline在相应版本为 1.20.0 时部署了我的撰写文件,但现在 1.21.1 已发布。我会做以下比较:

docker inspect nginx:mainline --format '{{.Id}}'

这将返回长 sha256 图像 ID nginx:mainline

然后,我可以使用以下命令查询存储库:

reg manifest nginx:mainline

这将返回一个描述图像及其图层的 json 文档。在config钥匙里,有一把digest钥匙。如果这个键匹配,你就知道它是同一个图像。如果不同,您就知道远程副本不同。

您可以jq与此命令结合使用以获取正确的值:

reg manifest nginx:mainline | jq -r .config.digest

这意味着如果我重新运行docker-compose up --pull -d,远程映像将被拉取并重新创建我的容器以使用它。

——

如果您使用特定版本标签而不是主线标签,那么您可以编写可用标签的脚本并尝试以编程方式确定是否有新版本。

对于 nginx 存储库,特定于版本的标签(不包括类似 的变体-alpine)始终只包含数字和点。因为这是该图像在其标签中进行版本控制的特定策略,所以我可以获得这样的列表并按版本对它们进行排序:

reg tags nginx | grep '^[0-9,.]*$' | sort -V

我必须确定某种方法来将该版本列表与当前版本进行比较,这在堆栈溢出问题中有所涉及:如何在 Bash 中比较点分隔版本格式的两个字符串?

当然,这只是基于 docker 官方镜像的镜像标记策略的一个示例,该镜像专门以这种特定模式标记软件的版本。其他图像作者可能有自己的模式,您需要为其实现逻辑。


以上是如何在docker-compose中找到更新版本的docker镜像的可用性的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>