Docker多个环境

34

我正在尝试理解Docker,但是很难搞明白。我尝试在我的小项目(MERN栈)中实现它,并且在想如何区分开发,(可能是staging),和生产环境。

我看到一个示例,他们使用了2个Docker文件和2个docker-compose文件(每对为一个环境,因此Dockerfile + docker-compose.yml用于生产环境,Dockerfile-dev + docker-compose-dev.yml用于开发环境)。

但对我来说似乎有点过度设计,我更喜欢只用两个文件。

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

在完美的解决方案中,我想运行类似于这样的东西:

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

请记住,我仍然不完全了解Docker,因此如果您注意到我关于Docker的一些误解,可以指出。

2个回答

37

您可以从 "在生产环境中使用Compose" 中获取一些提示。

您几乎肯定会希望对应用程序配置进行更改,以使其更适合实时环境。这些更改可能包括:

  • 删除任何应用程序代码的卷绑定,以便代码保留在容器内部,无法从外部更改
  • 绑定到主机上的不同端口
  • 以不同方式设置环境变量(例如,以降低日志的冗长性或启用电子邮件发送)
  • 指定重启策略(例如,restart: always)以避免停机时间
  • 添加额外的服务(例如,日志聚合器)

因此,这些建议与您提到的示例不完全相似:

因此,您可能希望定义一个附加的Compose文件,例如production.yml,其中指定了适用于生产环境的配置。此配置文件仅需要包含您想要从原始Compose文件中进行更改的内容。

docker-compose -f docker-compose.yml -f production.yml up -d
覆盖机制比在一个compose文件中混合开发和生产逻辑,并尝试通过环境变量选择一个要好得多。
注意:如果您将第二个dockerfile命名为docker-compose.override.yml,则简单的docker-compose up将自动读取覆盖。
但在您的情况下,基于环境的名称更清晰。

11

Docker Compose默认会读取docker-compose.ymldocker-compose.override.yml了解多个Compose文件

您可以设置一个默认的docker-compose.yml文件和不同的覆盖Compose文件。例如,docker-compose.prod.ymldocker-compose.test.yml。将它们放在同一位置。

然后为每个环境创建名为docker-compose.override.yml 的符号链接。
跟踪docker-compose.{env}.yml文件并将docker-compose.override.yml添加到.gitignore中。
在生产环境中: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/
  - ...

那么你就完成了。在每个环境中,您可以使用相同的命令docker-compose up来使用compose文件。

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


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