为持续交付创build大量Docker标记是否有任何问题?

目前,我们已经configuration了Jenkins作业来释放我们的服务,其他人则将其部署到testing,阶段和产品。 作为发布工作的一部分,我们创build了一个包含服务二进制文件(及其所有依赖项)的Docker镜像,该镜像被推送到我们的私有Docker存储库(使用新版本创build一个新的标签)。 到目前为止,这很好用,因为从Jenkins部署这个(或者更老的)版本到我们不同的环境很容易,或者只是拉取某个版本的服务并在本地运行。 我的问题是,如果我们转向持续交付,这种方法是否行得通? 我们的想法是,在每次成功构build之后,我们创build一个新的Docker标签并推送到我们的私有仓库,并将镜像部署到testing环境。 我担心的是,如果每天都要做好几次,那么会有很多需要下载的Docker标记/图层。 恐怕随着时间的推移,需要很长时间才能拉下图像(也许还有其他我不知道的问题)?

所以要更清楚地重述这个问题:

  1. 创build很多Docker标签是好的,还是应该避免的?
  2. 有一个基本的图像(操作系统等),然后从源代码pipe理系统中的标记build立服务二进制文件,然后build立一个图像,然后转移到不同的环境部署?
  3. 其他build议?

  1. 公共registry可以处理多个标签。 想想定期发布的1000张图片。 docker客户端和registry之间不需要标记同步,只要确保您的registry足够强大即可应对。 我假设你的testing过程的一部分,你拉下一个特定的图像和标签?
  2. 基本的图像总是优于每一次全新的构build。 它也会加快你的构build时间。

Docker Registry v1(python)在标签上缩放非常糟糕。 如果你使用的是分布式文件系统存储后端(比如GCS或者S3),那么这将会特别让你咬牙切齿。 有关上下文,请参阅https://github.com/docker/docker-registry/issues/614

现在,新协议(v2)和(golang)registry应该更好。

底线:

  • 除了v1协议/registry本身之外,您描述的方法没有任何问题。
  • 你应该赌docker1.6(释放候选人)和v2 golangregistry(这是在https://github.com/docker/distribution