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

Docker:为环境标记图像时,最佳做法是什么,docker,Docker,我有多种环境。它们是debug、dev和prod。我想引用最新dev(最新版本)或dev(1.1版)或prod(最新版本)的映像。我将如何标记构建和推送 我的第一个想法是为每个环境debug、dev和prod创建单独的存储库。但我开始怀疑我是否可以只使用一个存储库来实现这一点。如果可以使用一个容器,构建和推送时的语法是什么?这是对我和我的团队最有效的方法,我建议: 我建议对所有环境下的每个项目进行一次回购,这样更容易管理。特别是如果您有微服务,那么您的项目由多个微服务组成。每个项目每个环境管理一

我有多种环境。它们是debug、dev和prod。我想引用最新dev(最新版本)或dev(1.1版)或prod(最新版本)的映像。我将如何标记构建和推送


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

这是对我和我的团队最有效的方法,我建议:

我建议对所有环境下的每个项目进行一次回购,这样更容易管理。特别是如果您有微服务,那么您的项目由多个微服务组成。每个项目每个环境管理一份回购协议是一件痛苦的事情

例如,我有一个用户api。 docker repo是
用户
。该回购协议由
alpha
dev
beta
使用

我们在CI/CD服务中创建一个名为
$DOCKER\u TAG
的env变量,并在创建构建时进行设置,如下所示:

DOCKER\u标记:$(日期+%Y%m%d)。$BUILD\u编号
=>这是在bash中

其中,
$BUILD\u NUMBER
先前由触发CI/CD运行时运行的生成设置。例如,当我们合并一个PR时,会触发一个构建,作为构建编号1,因此
$build\u NUMBER:1

使用时生成的标记如下所示:
20171612.1
所以我们的docker图像是:
用户:20171612.1

为什么使用这种格式?

  • 它允许我们在不同的环境中使用相同的标签 运行任务
  • 它帮助我们跟踪图像创建的时间和内容 建立它所属的
  • 通过构建编号,我们可以找到提交信息,并根据需要将所有信息映射到一起,这对于trobleshooting来说很好
  • 它允许我们在每个项目中使用相同的docker回购协议
  • 很高兴知道我们何时从标记本身创建了图像
因此,当我们合并时,我们创建一个单一的构建。然后根据需要将该构建部署到不同的环境中。我们不会为每个环境创建独立的构建。我们会跟踪在哪里部署了什么

如果在一个有特定标签的环境中有一个bug,我们会拉这个标签,构建并trobleshoot,然后在这个条件下重现这个问题。如果我们发现问题,我们在标签中有版本号
20171612.1
,因此我们知道版本号1存在问题。我们检查CI/CD服务,它告诉我们什么是最新的提交。我们检查git中的提交哈希,并调试和修复该问题。然后我们将其部署为修补程序,例如

如果您还没有CI/CD,并且您正在手动执行此操作,则只需手动将标记设置为该格式(基本上按原样键入完整字符串),并使用提交短git哈希(如果您使用git),而不是内部版本号:

20170612.ed73d4f

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

您还可以为映射到代码版本的标记定义任何其他后缀,以便轻松地进行故障排除(例如,如果您正在使用git标记,则映射到git标记)

尝试它,根据需要调整它,并做最适合您和您的团队的事情。有很多方法可以使用标签。我们尝试了很多,这是我们目前最喜欢的

希望这能有所帮助。

我认为“lastest”是最后一张有成效的图片。这正是我在docker hub所期望的,尽管没有正在开发的图像

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


现在,当您准备生产一个候选版本时,尽管不在pruduccion环境中,您只需要有语义版本。这就是我要做的。

有两种思想流派,稳定的标签,可以更新单个标签,以及独特的标签。各有利弊。当部署到自愈集群时,稳定标记可能会造成不稳定性,因为新节点可能会拉取新版本,而集群的其余部分运行的是稍旧的版本。唯一标记是部署的最佳实践。但是,要管理操作系统和框架补丁的基本映像更新,您需要在dockerfile中构建稳定的标记,并启用自动容器构建。有关更详细的视频演示,请参阅以下帖子:

在您的示例中,
users
是docker repo,但您说您的图像是
users:$docker\u TAG
,在这种情况下,
users
是图像名称,而不是docker repo。您能澄清一下吗?Docker repo名称与图像名称匹配。例如,在dockerhub中,您的图像名称是/[:],因此这里的用户都是图像名称,由repo名称定义。这在其他映像注册表中可能有所不同。因此,本例中的完整映像引用是
用户/用户:$DOCKER\u标记
否。如果我的用户名是Juan,则本例中我的DOCKER完整映像将是Juan/用户:$DOCKER\u标记服务/容器名称中是否也包含
$DOCKER\u标记
?您将这些命名为什么?
最新的
通常是最后一个没有特定标签/版本的映像构建,因此不一定是生产映像。也读一下这个