Docker:为环境标记图像时的最佳做法是什么

时间:2017-06-12 22:00:40

标签: docker

我有多个环境。它们是debug,dev和prod。我想通过最新的dev(最新)或dev(1.1版)或prod(最新版)来引用图像。我将如何标记构建和推送?

我的第一个想法是为每个环境debug,dev和prod创建单独的存储库。但我开始怀疑我是否可以只用一个存储库来做到这一点。如果它可能与一个容器有关,那么构建和推送时的语法是什么?

3 个答案:

答案 0 :(得分:13)

这对我和我的团队最有效,我推荐它:

我建议针对所有环境的每个项目使用一个回购,这样更容易管理。特别是如果你有微服务,那么你的项目由多个微服务组成。每个项目每个环境管理一个回购是一件痛苦的事。

例如,我有一个用户api。 docker repo是users。此回购邮件由alphadevbeta使用。

我们在CI / CD服务中创建一个名为$DOCKER_TAG的env变量,并在创建构建时设置它,如下所示:

DOCKER_TAG: $(date +%Y%m%d).$BUILD_NUMBER =>这是在bash。

在触发CI / CD运行时,运行的构建先前设置了$BUILD_NUMBER。例如,当我们合并PR时,会触发构建,因为构建号。 1,所以$BUILD_NUMBER: 1

结果标记在使用时如下所示:20171612.1 所以我们的泊坞窗图片是:users:20171612.1

为何选择此格式?

  • 它允许我们使用a在不同的环境中部署相同的标记 运行任务。
  • 它可以帮助我们跟踪图像的创建时间和内容 构建它属于。
  • 通过内部版本号,我们可以根据需要找到提交信息并将它们全部映射在一起,非常适合于故障排除。
  • 它允许我们为每个项目使用相同的docker repo。
  • 很高兴知道我们何时从标签本身创建了图像。

因此,当我们合并时,我们创建一个单独的构建。然后根据需要将该构建部署到不同的环境。我们不会为每个环境创建一个独立的构建。我们会跟踪在哪里部署的内容。

如果某个环境中存在某个标记的错误,我们会在此条件下提取此标记,构建和解决问题并重现问题。如果我们发现问题,我们在标记20171612.1中有内置编号,因此我们知道编译号。 1有问题。我们检查我们的CI / CD服务,它告诉我们最新的提交。我们从git和debug中查看提交哈希并修复问题。然后我们将其部署为修补程序,例如。

如果您还没有配置CI / CD,并且手动执行此操作,只需手动设置该格式的标签(几乎按原样键入完整字符串)而不是内置编号,请使用提交短git哈希(如果你使用git):

20170612.ed73d4f

因此,您知道什么是最新的提交,以便您可以解决特定图像的问题,并映射回代码以根据需要创建修复。

您还可以为您的代码定义映射到代码版本的任何其他后缀,以便您轻松排除故障(例如,如果您使用的话,请映射到git代码)。

尝试一下,根据需要进行调整,并为您和您的团队做最有效的事情。有很多方法可以解决标记问题。我们尝试过很多,到目前为止我们最喜欢这个。

希望这有帮助。

答案 1 :(得分:3)

有两种思想流派,稳定的标记,您可以更新单个标记,以及唯一标记。每个都有其优点和缺点。在部署到自我修复群集时,稳定标记可能会产生不稳定性,因为新节点可能会提取新版本,而群集的其余部分运行的版本稍微过旧。唯一标记是部署的最佳实践。但是,要管理OS&amp ;;的基本映像更新。框架修补,您将希望在dockerfile中构建稳定的标记,并启用自动容器构建。有关视觉效果的详细介绍,请点击此处: https://blogs.msdn.microsoft.com/stevelasker/2018/03/01/docker-tagging-best-practices-for-tagging-and-versioning-docker-images/

答案 2 :(得分:1)

我认为“最新”是最后一张富有成效的形象。这是我在docker hub中的期望,尽管没有开发中的图像。

另一方面,您可以使用标签,例如0.0.1-dev。完成此映像后,您可以再次执行标记并按下,然后存储库将检测到这些层已存在于存储库中。

现在,当你是一个即将出版的候选版本时,你必须只拥有语义版本,尽管不在环境保护中。这就是我要做的。