【问题标题】:Docker Compose Dev and Production Environments Best WorkflowDocker Compose 开发和生产环境最佳工作流程
【发布时间】:2015-10-18 10:22:37
【问题描述】:

我已经构建了一个简单的 Docker Compose 项目作为开发环境。我有 PHP-FPM、Nginx、MongoDB 和 Code 容器。
现在我想自动化这个过程并部署到生产环境中。
docker-compose.yml 可以扩展并且可以定义多个环境。请参阅https://docs.docker.com/compose/extends/ 了解更多信息。
但是,我的容器有 Dockerfile。开发环境需要比生产环境更多的包。

主要问题是我应该为dev 和prod 使用单独的dockerfile 并在docker-compose.yml 和production.yml 中管理它们吗?
单独的 dockerfile 是一种简单的方法,但存在代码重复。

另一种解决方案是使用环境变量并以某种方式从 bash 脚本中处理它们(也许作为入口点?)。

我正在寻找其他想法。

【问题讨论】:

    标签: docker environment-variables dockerfile docker-compose


    【解决方案1】:

    根据the official docs:

    ...你可能想要定义一个单独的 Compose 文件,比如说 production.yml,指定适合生产的配置。

    注意:extends 关键字对于维护多个 Compose 很有用 无需手动复制和重复使用公共服务的文件 粘贴。

    【讨论】:

    • 是的,我做到了,但我仍然需要为开发和生产环境安装一些包,这是在 Dockerfile 中完成的。但是 dockerfiles 没有像其他语言那样的控制结构,所以你无法根据环境控制安装什么。
    • 在这种情况下,您可能需要考虑使用 ansible。它的工作原理是这样的:使用 Dockerfile 只是用 ansible 引导映像,然后让 ansible 接管。如果你想一路走来自动化一切,你可以从 ansible playbooks 开始,在你的本地机器上创建 Docker 镜像;然后将它们推送到私有(或公共)注册表(也在 docker 中运行:)然后编写 ansible playbook 以在远程主机上获取这些图像并启动容器
    • 这可以通过为开发和生产使用单独的 Dockerfile 来解决(我想你也可以有一个共同的基础)。
    【解决方案2】:

    在docker-compose 版本>= 1.5.0 中,您可以使用environment variables,这可能适合您吗?

    【讨论】:

      【解决方案3】:

      如果开发所需的包不是太重(即图像大小不是很大),您可以创建包含所有组件的Dockerfiles,然后根据值决定是否激活它们入口点中的环境变量。

      这样您就可以让主docker-compose.yml 提供生产 环境,而development.yml 只需在需要的地方添加正确的环境变量值。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-05
          • 1970-01-01
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          • 2018-06-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多