目前,我们的 CI/CD 环境基于 Kubernetes 云。 由于性能优势,Kubernetes 云提供商最近删除了 docker deamon。例如,Google Kubernetes Engine 或 IBM Cloud Kubernetes 仅具有 Containerd 运行时,用于运行,但不构建容器镜像。
许多工具,例如 kaniko或jib修复这个差距。它们提供了一种非常有效地构建 docker 镜像的方法,而不需要 docker deamon。
问题来了:
- 图像“registry-x.com/repo/app1:v1-snapshot”从 CI 中的 jib 构建到registry-x。
- 镜像“registry-x.com/repo/app1:v1-snapshot”会在某个时间点进行部署和测试,如果测试成功,则需要将其传送到注册表 Y,并且需要进行标记作为注册表 X 中的稳定版本。
因此图像“registry-x.com/repo/app1:v1-snapshot”需要从“registry-x.com/repo/app1:v1-snapshot”标记为“registry-x.com/web/” app1:v1-release”,然后需要另外标记“registry-y.com/web/app1:v1-release”,并且两者都需要推送。
结果:开发的快照镜像在两个注册表中都可用,并带有发布标签。
那么如何在没有 docker deamon 的情况下完成这 3 个简单的操作(Pull、Tag、Push)呢?看来 kaniko 和 jib 不是一个办法。
我不想订购虚拟机只是为了让 docker 守护进程来执行这些操作。我还知道 Jib 能够推送到多个注册表。但它不能仅仅重命名图像。
也与去年的这个问题相关: Clone an image from a docker registry to another
问候,莱昂
最佳答案
Docker 注册表提供 HTTP API ,因此您可以使用这些方法来拉取和推送图像。
有几个库在其上提供了更高的抽象层( docker-registry-client in Go 、 docker-registry-client in Js 等)。
无论如何,流程都是
-
- Retrieve manifests来自
registry-x.com/repo/app1:v1-snapshot
。 - Download list 上命名的层(blob)的数量。
- Retrieve manifests来自
-
- 上传您之前下载的所有图层
- 使用新版本修改原始 list
- 上传新 list
关于kubernetes - 将镜像从注册表 Y 拉取、标记并推送到注册表 X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54914127/