我试图绕过Docker,但我很难搞清楚。我试图在我的小项目(MERN堆栈)中实现它,我在想如何区分开发,(可能是分段)和生产环境。
我看到一个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
请记住,我仍然没有完全获得码头工具,所以如果你发现了一些关于码头工具的误解,你可以指出它们。
答案 0 :(得分:19)
您可以从" Here's a fiddle"
中获取一些线索您几乎肯定希望更改适合实时环境的应用配置。这些变化可能包括:
- 删除应用程序代码的任何卷绑定,以便代码保留在容器内且无法从外部更改
- 绑定到主机上的不同端口
- 以不同方式设置环境变量(例如,减少日志记录的详细程度或启用电子邮件发送)
- 指定重启策略(例如,重启:始终)以避免停机
- 添加额外服务(例如,日志聚合器)
这个建议与你提到的例子不太相似:
出于这个原因,您可能希望定义一个额外的Compose文件,比如
production.yml
,它指定适合生产的配置。此配置文件只需要包含您要从原始Compose文件中进行的更改。docker-compose -f docker-compose.yml -f production.yml up -d
这个 Using Compose in production 比尝试在一个撰写文件中混合dev和prod逻辑要好,用环境变量来尝试选择一个。
注意:如果您为第二个dockerfile docker-compose.override.yml
命名,则一个简单的docker-compose up
会自动读取覆盖。
但在您的情况下,基于环境的名称更清晰。
答案 1 :(得分:3)
Docker Compose默认会读取docker-compose.yml
和docker-compose.override.yml
。 Understanding-Multiple-Compose-Files
您可以设置默认docker-compose.yml
和不同的覆盖撰写文件。例如,docker-compose.prod.yml
docker-compose.test.yml
。把它们放在同一个地方。
然后为每个env创建一个名为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/
- ...
然后你就完成了。在每个环境中,您可以使用具有相同命令docker-compose up
如果您不确定,请使用docker-compose config
检查是否已正确覆盖。