Docker Compose 开发和生产环境最佳工作流程

4
我已经建立了一个简单的 Docker Compose 项目作为开发环境。我有 PHP-FPM、Nginx、MongoDB 和 Code 的容器。
现在我想要自动化这个过程并且部署到生产环境。
docker-compose.yml 可以扩展并定义多个环境。更多信息请参见 https://docs.docker.com/compose/extends/
然而,我的容器有 Dockerfiles。对于开发环境,需要更多的软件包,而在生产环境中则不需要这些软件包。
主要问题是我应该为 devprod 使用不同的 dockerfiles 并且在 docker-compose.ymlproduction.yml 中管理它们吗?
分离的 dockerfiels 是一种简单的方法,但会导致代码重复。
另一个解决方案是使用环境变量并从 bash 脚本中处理它们(也许作为入口点)。
我正在寻找其他的想法。
4个回答

1
根据官方文档

... 你可能希望定义一个单独的Compose文件,例如production.yml,其中指定适合生产环境的配置。

注意:使用extends关键字可以维护多个Compose文件,重复使用共同服务而无需手动复制和粘贴。


2
是的,我已经这样做了,但我仍然需要在开发和生产环境中安装一些软件包,这是在 Dockerfile 中完成的。但是 Dockerfile 没有像其他语言那样的控制结构,因此您无法根据环境来控制安装哪些软件包。 - Jeliu Jelev
在这种情况下,您可能想考虑使用ansible。它的工作方式是:使用Dockerfile引导带有ansible的映像,然后让ansible接管。如果您想走到底并自动化所有内容,则可以从ansible playbooks开始,在本地机器上创建Docker映像;然后将它们推送到私有(或公共)注册表(也在docker中运行 :)),然后编写ansible playbooks以在远程主机上获取这些映像并启动容器。 - milan
可以通过为开发和生产分别创建Dockerfile来解决这个问题(我想你也可以有一个共同的基础)。 - Fuzzy76

1
在docker-compose版本>=1.5.0中,您可以使用环境变量,也许这适合您?

1
如果开发所需的软件包不太重(即镜像大小没有显著增加),您可以创建包含所有组件的Dockerfile,然后根据入口点中环境变量的值决定是否激活它们。这样,您可以将主要的docker-compose.yml提供生产环境,而development.yml则只在需要时添加正确的环境变量值。

0
在这种情况下,考虑使用“onbuild”镜像来处理环境中的共性,然后使用单独的镜像来处理具体内容可能是值得考虑的。一些官方镜像有onbuild版本,例如Node。或者您可以创建自己的镜像。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接