问题 Docker多种环境


我正试着把头包裹在Docker身边,但是我很难搞清楚它。我试图在我的小项目(MERN堆栈)中实现它,我在想如何区分开发,(可能是暂存)和生产环境。

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

但这对我来说似乎有些过分。我宁愿只用两个文件。

另一个问题是例如开发我想全局安装nodemon,但不是为了生产。

在完美的解决方案中,我想象运行这样的东西

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

请记住,我仍然没有完全得到docker,所以如果你发现了一些关于docker的误解,你可以指出它们。


1211
2018-02-17 00:45


起源



答案:


你可以从“在生产中使用Compose

您几乎肯定希望对更适合实时环境的应用配置进行更改。这些变化可能包括:

  • 删除应用程序代码的任何卷绑定,以便代码保留在容器内,不能从外部更改
  • 绑定到主机上的不同端口
  • 以不同方式设置环境变量(例如,减少日志记录的详细程度或启用电子邮件发送)
  • 指定重新启动策略(例如,重新启动:始终)以避免停​​机
  • 添加额外服务(例如,日志聚合器)

这个建议与你提到的例子不太相似:

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

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

这个 压倒机制 比尝试在一个撰写文件中混合dev和prod逻辑更好,用环境变量来尝试选择一个。

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


12
2018-02-17 05:35



太棒了,谢谢你的解释! - maciejmatu


答案:


你可以从“在生产中使用Compose

您几乎肯定希望对更适合实时环境的应用配置进行更改。这些变化可能包括:

  • 删除应用程序代码的任何卷绑定,以便代码保留在容器内,不能从外部更改
  • 绑定到主机上的不同端口
  • 以不同方式设置环境变量(例如,减少日志记录的详细程度或启用电子邮件发送)
  • 指定重新启动策略(例如,重新启动:始终)以避免停​​机
  • 添加额外服务(例如,日志聚合器)

这个建议与你提到的例子不太相似:

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

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

这个 压倒机制 比尝试在一个撰写文件中混合dev和prod逻辑更好,用环境变量来尝试选择一个。

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


12
2018-02-17 05:35



太棒了,谢谢你的解释! - maciejmatu


Docker Compose将会读取 docker-compose.yml 和 docker-compose.override.yml 默认。 理解,多撰写档案

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

然后创建一个名为的符号链接 docker-compose.override.yml 为每个环境。
跟踪 docker-compose.{env}.yml 文件和添加 docker-compose.override.yml 至 .gitignore
在prod env: ln -s ./docker-compose.prod.yml ./docker-compose.override.yml
在测试环境中: 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/
  - ...

然后你就完成了。在每个环境中,您可以使用具有相同命令的compose-file docker-compose up

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


2
2017-07-30 23:36