Dockerfile 应该提交到哪个代码存储库?

Xav*_*ero 1 architecture version-control dockerfile devops

长话短说

我应该在哪里提交 Dockerfile?在项目代码库中还是在 devops 代码库中?

推理细节:

没有 docker 和 CI

在古代,当开发具有多个代码库的复杂应用程序时,人们通常希望每个项目有一个 repo,并将所有密码、凭据和 dev/test/pre/prod 配置与代码分开。

+-----------------------------------------------------------------------+
|                                                                       |
|  +---------+       +---------+       +---------+       +---------+    |
|  |  app-1  |       |  app-2  |       |  app-3  |       |  app-4  |    |
|  +---------+       +---------+       +---------+       +---------+    |
|                                                                       |
|                            +----+                                     |
|                            |    |\                                    |
|                            |    +-+                                   |
|                            | conf |                                   |
|                            | files|                                   |
|                            +------+                                   |
|                                                                       |
+-----------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

在古代,一位系统管理员在服务器中安装了该软件,然后复制了配置文件。早在 90 年代,管理员通常将这些文件放在他自己的目录中,仅与老板共享。

有 CI 但仍然没有 docker

后来我们改进了循环:在 Continuos 开发/集成环境中,“系统”本身需要能够克隆所有这些存储库,并能够“构建”应用程序并将它们配置为准备运行。然后将构建复制到服务器并相应地配置它们。

这使所有开发人员都可以在生产中触发部署,同时不会泄露密钥。

在容器之前,通常公司有一个额外的“devops”(AKA CI repo),我们在那里组织了所有这些配置文件,并通过脚本了解。CI 服务器(pre-docker)知道所有源代码存储库,知道目标网络拓扑,拥有云的密码,并复制/构建/部署其目标中的所有内容并对其进行配置,从而无需人工如果服务器启动并运行,则进行干预。

+-----------------------------------------------------------------------+
|                                                                       |
|  +---------+       +---------+       +---------+       +---------+    |
|  |  app-1  |       |  app-2  |       |  app-3  |       |  app-4  |    |
|  +---------+       +---------+       +---------+       +---------+    |
|                                                                       |
|                          +----------------+                           |
|                          |     devops     |                           |
|                          +----------------+                           |
|                          | config-1-devel |                           |
|                          | config-1-pre   |                           |
|                          | config-1-prod  |                           |
|                          | config-2-devel |                           |
|                          |      [...]     |                           |
|                          | config-4-prod  |                           |
|                          +----------------+                           |
|                                                                       |
+-----------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

使用 Docker 进行 CI

当谈到让 docker 在等式中发挥作用时,我想知道 Dockerfile 的正确位置是在应用程序 CVS 存储库中还是在 devops 存储库中。

Dockerfile 会进入应用程序代码库吗?

除非我们做一个需要在多个平台上运行的开源代码,否则通常公司会建立一个目标平台,编码人员事先“知道”目标系统将是 Ubuntu 或 CentOs 等。

另一方面,现在编码人员自己将 Dockerfile 作为一个 moe 源代码文件。这促使我们认为 Dockerfile 适合每个代码库,因为应用程序和它运行的系统将 - 可能 - 通过需要某些要求而耦合。

+-----------------------------------------------------------------------+
|                                                                       |
| +-------------+   +-------------+   +-------------+   +-------------+ |
| |    app-1    |   |    app-2    |   |    app-3    |   |    app-4    | |
| +-------------+   +-------------+   +-------------+   +-------------+ |
| |Dockerfile-1 |   |Dockerfile-2 |   |Dockerfile-3 |   |Dockerfile-4 | |   
| +-------------+   +-------------+   +-------------+   +-------------+ |
|                                                                       |
|                          +----------------+                           |
|                          |     devops     |                           |
|                          +----------------+                           |
|                          | config-1-devel |                           |
|                          | config-1-pre   |                           |
|                          | config-1-prod  |                           |
|                          | config-2-devel |                           |
|                          |      [...]     |                           |
|                          | config-4-prod  |                           |
|                          +----------------+                           |
|                                                                       |
+-----------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

或者 Dockerfile 会进入 devops 代码库(又名 CI 服务器代码库)吗?

但似乎程序员也应该执行相同的代码行,例如,如果他正在编写一个 Web 应用程序,尽管它是在 apache、nginx 或 caddy 服务器下运行的……所以运行时的“决定”似乎它应该被编码到 devops 代码库中:

+-----------------------------------------------------------------------+
|                                                                       |
| +-------------+   +-------------+   +-------------+   +-------------+ |
| |    app-1    |   |    app-2    |   |    app-3    |   |    app-4    | |
| +-------------+   +-------------+   +-------------+   +-------------+ |
|                                                                       |
|                          +----------------+                           |
|                          |     devops     |                           |
|                          +----------------+                           |
|                          | Dockerfile-1   |                           |
|                          | Dockerfile-2   |                           |
|                          | Dockerfile-3   |                           |
|                          | Dockerfile-4   |                           |
|                          +----------------+                           |
|                          | config-1-devel |                           |
|                          | config-1-pre   |                           |
|                          | config-1-prod  |                           |
|                          | config-2-devel |                           |
|                          |      [...]     |                           |
|                          | config-4-prod  |                           |
|                          +----------------+                           |
|                                                                       |
+-----------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

在团队中,我们无法澄清正确的方法,我已经进行了搜索,但我无法找到证明不同 Dockerfile 应该提交到应用程序存储库或 devops 存储库(AKA CI 存储库)中的文档。

我应该在哪里提交它们?

小智 5

我建议将它保留在您的应用程序中,因为它应该随代码库一起发展。恕我直言,最佳实践是将 CI 代码和配置与您的应用程序一起保存,而不是在单独的存储库中,因此您不必管理应用程序代码版本和配置之间的依赖关系。