Docker 练习 CI/CD 和部署

Docker practice for CI/CD and deployment

我是 Docker 的新手,阅读了一些有关它的文章。

我读了很多文章说 "use same image for all environments(dev/stage/production)" 和 "image for CI/CD and for deployment are different"。

但我无法整合这两个建议,而且我也找不到 docker文件示例。

这是否意味着我必须制作以下两张 docker 图片?

(1) image for deployment
- application code and its dependencies
- there is no CMD 

(2) image for CI/CD
- use (1) as base image
- add extra for CI/CD

我认为您的困惑来自第 4 部分:

The deployment images should contain:

  • The application code in minified/compiled form plus its runtime dependencies.
  • Nothing else. Really nothing else.

The second category is the images used for the CI/CD systems or developers and might contain:

  • The source code in its original form (i.e. unminified)
  • Compilers/minifiers/transpilers (etc)

虽然许多开发人员认为它很自然,但我认为这不是一个很好的设置,它显示了第一个反模式,将容器视为 VM。

在我看来,在开发过程中,目标容器应该包括编译器、测试框架等。它应该只包含编译后的代码和运行时间对于它,就像生产的容器一样。

所有这些工具都属于一个 不同的 容器(我们称它为 "utility"),专门用于使构建和测试统一且可重现。该容器已经安装了构建所有容器或其广泛子集(例如所有 Node 和 Python 容器)可能需要的所有工具。你在调用它时挂载你的源目录,它编译/缩小/打包代码,生成 gRPC 存根,运行s 测试套件等。

您可以在本地和 CI/CD 中使用相同的实用程序容器。您的构建和测试管道独立于 OS(在我们公司的开发人员 运行 Windows、macOS 和 Linux 的桌面上,但用于构建后端服务没有区别)。您永远不必处理不同 "development" 图像之间的编译器版本、测试框架版本、eslint 配置等的不同动物园。

当然,您可以 运行 在生产和开发中使用编译代码不同的相同图像:例如您可以公开端口以附加调试器等。但它是来自容器外部的(轻型)配置,而不是不同的构建。

所以不,在我看来,您应该在开发、CI/CD 和生产中使用相同的容器。在我工作的一家公司中,所有容器都有加密签名,你只能将一个容器升级为 QA/staging/prod,该容器是根据特定提交构建并通过测试的,每次升级时都会检查签名。当然,将编译器留在这样的容器中是一种失误。