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.ymldocker-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检查它是否被正确覆盖。