如何使用 Dockerfile 管理特定版本的构建
how do I manage specific versions of builds with Dockerfile
普遍接受的做法是在一个干净的目录中有一个名为 Dockerfile
的文件,我可能需要 COPY
到我的图像中的任何东西都位于该目录中。对于一个运行良好的单一版本。
但是,如果我有多个版本的图像需要编译怎么办?我可能有 1.2、1.4 和 2.0 的流,其中任何一个都可以有补丁版本。我的 Dockerfile 本身会根据版本将各种二进制文件安装到映像中:1.2 安装 mybin 1.2; 1.4 安装mybin 1.4;等等
所以二进制文件的版本实际上在 Dockerfile 中。
那么如何在不让 Dockerfile 激增的情况下控制版本?
我看到几个选项:
- 有一个并编辑它,然后将其重新签入 git。好的,但是我该如何构建 1.4.2 和 1.2.7?
- 有多个目录,例如
myimage/1.4/
包含 1.4 的所有安装(包括 Dockerfile、二进制文件等),而 myimage/2.0/
包含 2.0 的所有安装。
- 每个点版本甚至补丁版本都有一个目录(以前的解决方案达到了极致)。这感觉很多余。
- 为所有构建创建一个目录,并使用一些自动化流程来确定我的构建编号,例如一个调用
docker build
的脚本,一些脚本安装在图像中。显得格外凌乱。
- 有一个目录但有单独的 dockerfiles,例如
Dockerfile.1.4.2
和 Dockerfile.2.0.7
。
这似乎归结为 1.2 和 1.2.7,或者 1.2 和 1.4 和 1.0 之间有多少相似性。换句话说,我是将发布硬编码到 Dockerfile 中,还是尝试围绕它实现自动化?
这里管理发布的明智方法是什么?
虽然这很麻烦,但我会选择选项 #2(多个目录)或使用 git 分支而不是目录的扩展版本。
docker 库(creating/maintaining 基本映像,如 debian、wordpress、gcc 等)的人员使用单独目录的方法(参见示例 GCC dockerfile on GitHub)。这样你就可以很好地与 Docker Hub 集成(例如自动构建)。
如果您使用 git,另一种选择是使用不同的分支。因此,您将拥有存储库 myimage
,然后分支到 1.0、1.2、1.4 等等。现在您还可以标记补丁。同样,来自 Docker Hub 的 Automated builds
可以与此方法一起使用。
我会说,从软件工程/发布管理的角度来看,基于分支的选项是最干净的解决方案。您可以从专用分支构建应用程序的不同版本,然后通过 Docker 文件的正确版本发布它。这也意味着您可以将一个分支的更改合并到另一个分支,并将其正确记录在历史记录中。
顺便说一句,最好的做法是将 Docker 文件放在应用程序源代码的根文件夹中。
普遍接受的做法是在一个干净的目录中有一个名为 Dockerfile
的文件,我可能需要 COPY
到我的图像中的任何东西都位于该目录中。对于一个运行良好的单一版本。
但是,如果我有多个版本的图像需要编译怎么办?我可能有 1.2、1.4 和 2.0 的流,其中任何一个都可以有补丁版本。我的 Dockerfile 本身会根据版本将各种二进制文件安装到映像中:1.2 安装 mybin 1.2; 1.4 安装mybin 1.4;等等
所以二进制文件的版本实际上在 Dockerfile 中。
那么如何在不让 Dockerfile 激增的情况下控制版本?
我看到几个选项:
- 有一个并编辑它,然后将其重新签入 git。好的,但是我该如何构建 1.4.2 和 1.2.7?
- 有多个目录,例如
myimage/1.4/
包含 1.4 的所有安装(包括 Dockerfile、二进制文件等),而myimage/2.0/
包含 2.0 的所有安装。 - 每个点版本甚至补丁版本都有一个目录(以前的解决方案达到了极致)。这感觉很多余。
- 为所有构建创建一个目录,并使用一些自动化流程来确定我的构建编号,例如一个调用
docker build
的脚本,一些脚本安装在图像中。显得格外凌乱。 - 有一个目录但有单独的 dockerfiles,例如
Dockerfile.1.4.2
和Dockerfile.2.0.7
。
这似乎归结为 1.2 和 1.2.7,或者 1.2 和 1.4 和 1.0 之间有多少相似性。换句话说,我是将发布硬编码到 Dockerfile 中,还是尝试围绕它实现自动化?
这里管理发布的明智方法是什么?
虽然这很麻烦,但我会选择选项 #2(多个目录)或使用 git 分支而不是目录的扩展版本。
docker 库(creating/maintaining 基本映像,如 debian、wordpress、gcc 等)的人员使用单独目录的方法(参见示例 GCC dockerfile on GitHub)。这样你就可以很好地与 Docker Hub 集成(例如自动构建)。
如果您使用 git,另一种选择是使用不同的分支。因此,您将拥有存储库 myimage
,然后分支到 1.0、1.2、1.4 等等。现在您还可以标记补丁。同样,来自 Docker Hub 的 Automated builds
可以与此方法一起使用。
我会说,从软件工程/发布管理的角度来看,基于分支的选项是最干净的解决方案。您可以从专用分支构建应用程序的不同版本,然后通过 Docker 文件的正确版本发布它。这也意味着您可以将一个分支的更改合并到另一个分支,并将其正确记录在历史记录中。
顺便说一句,最好的做法是将 Docker 文件放在应用程序源代码的根文件夹中。