Docker 多个环境

Docker multiple environments

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

我看到一个 example 他们使用了 2 个 Docker 文件和 2 个 docker-compose 文件,(每对一个环境,所以 Dockerfile + docker-compose.yml for prod, Dockerfile-dev + docker-compose-dev.yml for dev).

但这对我来说似乎有点矫枉过正。我宁愿把它放在两个文件中。

还有一个问题是,例如为了开发,我想在全球范围内安装 nodemon,但不是为了生产。

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

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

请记住,我仍然没有完全理解 docker,所以如果你发现我对 docker 的一些误解,你可以指出来。

你可以从“Using Compose in production

中得到一些线索

You’ll almost certainly want to make changes to your app configuration that are more appropriate to a live environment. These changes may include:

  • Removing any volume bindings for application code, so that code stays inside the container and can’t be changed from outside
  • Binding to different ports on the host
  • Setting environment variables differently (e.g., to decrease the verbosity of logging, or to enable email sending)
  • Specifying a restart policy (e.g., restart: always) to avoid downtime
  • Adding extra services (e.g., a log aggregator)

该建议与您提到的示例不太相似:

For this reason, you’ll probably want to define an additional Compose file, say production.yml, which specifies production-appropriate configuration. This configuration file only needs to include the changes you’d like to make from the original Compose file.

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

overriding mechanism 比尝试在一个组合文件中混合开发和生产逻辑要好,要尝试使用环境变量,select 一个。

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

Docker Compose 默认会读取 docker-compose.ymldocker-compose.override.ymlUnderstanding-Multiple-Compose-Files

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

然后为每个环境创建一个名为 docker-compose.override.yml 的符号 link。
跟踪 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

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