Docker多个环境
我试图把我的头围绕在Docker上,但是我很难搞清楚。 我试图在我的小型项目(MERN堆栈)中实现它,我想你如何区分开发(可能是分期)和生产环境。
我看到一个例子 ,他们使用了2个Docker文件和2个docker-compose文件(每个包含一个env,所以Dockerfile + docker-compose.yml用于devod,Dockerfile-dev + docker-compose-dev.yml用于dev) 。
但是这对我来说似乎有点矫枉过正。 我宁愿只有两个文件。
还有一个问题是,例如对于开发,我想安装nodemon全球,但不是生产。
在完美的解决scheme中,我想像那样运行
docker-compose -e ENV=dev build docker-compose -e ENV=dev up
请记住,我还没有完全得到docker工人,所以如果你发现了我对docker工人的一些误解,你可以指出他们。
你可以从“ 在生产中使用组合 ”中得到一些线索
您几乎可以肯定地希望对适用于实时环境的应用程序configuration进行更改。 这些变化可能包括:
- 删除应用程序代码的任何卷绑定,以便代码保留在容器内,不能从外部更改
- 绑定到主机上的不同端口
- 以不同的方式设置环境variables(例如,减lesslogging的详细程度或启用电子邮件发送)
- 指定重新启动策略(例如,重新启动:始终)以避免停机
- 添加额外的服务(例如日志聚合器)
这个build议与你提到的例子不太相似:
由于这个原因,你可能想要定义一个额外的Compose文件,比如
production.yml
,它指定了与生产相关的configuration。 此configuration文件只需要包含您想要从原始撰写文件中所做的更改。docker-compose -f docker-compose.yml -f production.yml up -d
这个重写机制比在一个组合文件中混合使用dev和prod逻辑要好一些,用环境variables来select一个。
注意:如果你命名你的第二个dockerfile docker docker-compose.override.yml
,一个简单docker-compose.override.yml
docker-compose up
会自动读取覆盖。
但就你而言,基于环境的名称更清晰。
Docker Compose默认会读取docker-compose.yml
和docker-compose.override.yml
。 理解,多撰写档案
您可以设置一个默认docker-compose.yml
和不同的覆盖撰写文件。 例如, docker-compose.prod.yml
docker-compose.test.yml
docker-compose.prod.yml
docker-compose.test.yml
。 让他们在同一个地方。
然后为每个env创build一个名为docker-compose.override.yml
的符号链接。 并将docker-compose.override.yml
添加到.gitignore
。
在prod env: ln -s ./docker-compose.prod.yml ./docker-compose.override.yml
在testing环境中: ln -s ./docker-compose.test.yml ./docker-compose.override.yml
项目结构将如下所示:
project\ - docker-compose.yml - docker-compose.prod.yml - docker-compose.test.yml - docker-compose.override.yml # this is a symbolic link # it is linked to override compose file for current env # and it is ignored by git - src/ - ...
那你就完成了。 在每个环境中,您可以使用相同的命令docker-compose up
使用组合文件
如果您不确定,请使用docker-compose config
检查它是否被正确覆盖。