2017-02-17 87 views
10

我想绕过Docker,但我很难搞清楚它。我试图在我的小型项目(MERN堆栈)中实现它,并且我在考虑如何区分开发(可能是分段)和生产环境。Docker多个环境

我看到一个example他们使用了2个Docker文件和2个docker-compose文件(每个对一个env,所以Dockerfile + docker-compose.yml用于prod,Dockerfile-dev + docker-compose-dev)。 yml for dev)。

但这对我来说似乎有点矫枉过正。我宁愿只有两个文件。

另外一个问题是,例如,对于开发,我想要全局安装nodemon,但不能用于生产。

在完美的解决方案我想运行类似的东西

docker-compose -e ENV=dev build 
docker-compose -e ENV=dev up 

请记住,我还没有完全得到泊坞窗,所以如果你抓住了一些有关码头工人雷误解的,你可以点出来。

回答

11

你可以采取一些线索来自“Using Compose in production

你几乎肯定要做出更适合于现场环境的变化,以您的应用程序的配置。这些变化可能包括:

  • 删除应用程序代码的任何音量绑定,从而使代码保持容器内,不能从外部
  • 绑定到不同的端口主机
  • 设置环境变量的变化不同(例如,降低日志的详细程度,或使电子邮件发送)
  • 指定重新启动策略(如重启:总是),以避免停机
  • 增加额外的服务(如日志聚合器)

的建议是,再不行颇为相似,你所提到的例子:

出于这个原因,你可能要定义一个额外撰写文件,说production.yml,指定生产合适组态。此配置文件只需包含您想要从原始撰写文件中进行的更改。

docker-compose -f docker-compose.yml -f production.yml up -d 

overriding mechanism是不是试图在撰写文件混合开发和督促逻辑,环境变量,试图选择一个更好的。

注意:如果您命名第二个码头文件docker-compose.override.yml,则简单docker-compose up会自动读取覆盖码。
但在你的情况下,基于环境的名称更清晰。

+0

太棒了,谢谢你的解释! –

2

默认情况下,Docker Compose将读取docker-compose.ymldocker-compose.override.ymlUnderstanding-Multiple-Compose-Files

您可以设置一个默认的docker-compose.yml和不同的覆盖撰写文件。例如,docker-compose.prod.ymldocker-compose.test.yml。让他们在同一个地方。

然后为每个env创建一个名为docker-compose.override.yml的符号链接。
Track docker-compose.{env}.yml files and add docker-compose.override.yml to .gitignore
在督促ENV:ln -s ./docker-compose.prod.yml ./docker-compose.override.yml
在测试ENV:ln -s ./docker-compose.test.yml ./docker-compose.override.yml
然后,项目结构如下所示:

project\ 
    - docker-compose.yml  # tracked 
    - docker-compose.prod.yml # tracked 
    - docker-compose.test.yml # tracked 
    - docker-compose.override.yml # ignored 
      #linked to override composefile for current env 
    - src/ 
    - ... 

然后你做了。在每个环境中,您可以使用具有相同命令的撰写文件docker-compose up

如果您不确定,请使用docker-compose config检查它是否被正确覆盖。