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.yml
和 docker-compose.override.yml
。 Understanding-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
检查是否已正确覆盖。
我正在努力思考 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.yml
和 docker-compose.override.yml
。 Understanding-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
检查是否已正确覆盖。