首页 > 解决方案 > 如何跨不同的生命周期环境运行 docker-compose

问题描述

如何在不同的生命周期环境(比如开发、质量保证、登台、生产)中运行 docker-compose。有时,多个开发人员共享一个更大的 VM,因此希望使用适当的开发人员特定后缀(例如 dev1、dev2、dev3 ..)启动容器。是否应该通过环境文件(即 .env 文件)手动处理端口自定义

标签: docker-compose

解决方案


这是 docker-compose 的一个不寻常的用例,但无论如何我都会留下一些提示!:)

有两种不同的方式来命名你从 docker-compose 开始的东西。一种是命名您在docker-compose.yml 文件的主键下指定的服务。services:默认情况下,将为各个运行的容器分配名称,指示它们来自哪个项目(默认情况下,您的 docker-compose 文件所在目录的名称),它们运行的​​服务(这是在您的services:密钥下指定的),以及它们是该服务的哪个实例(例如,如果您使用的是replicas,则此数字会发生变化)。例如。myservicecompose 文件中指定的服务的默认容器名称~/my_project/docker/docker-compose.yml将具有类似的名称docker_myservice_1(或_2_3如果应该运行多个容器,则等)。

您可以使用环境变量在 docker-compose 文件中指定很多键值对,但您不能有条件地指定服务名称 - 服务键只允许在其中包含字母数字字符并且撰写文件不能看起来像例如:

version: "3"

services:
  ${ENVVAR}:
    image: ubuntu:20.04

但是,您可以使用docker-compose 文件中的字段来覆盖容器命名方案(此处的使用文档)。也许您可以使用的解决方案如下所示:container_name

version: "3"
services:
  myservice:
    image: ubuntu:20.04
    container_name: ${DEVELOPER_ENVVAR?err}

这将要求开发人员在运行时指定 DEVELOPER_ENVVAR,方法是在他们的 shell 中导出它或运行 docker-compose like DEVELOPER_ENVVAR=myservice_dev1 docker-compose up。请注意,使用 container_name 与使用副本为同一服务运行多个容器不兼容 - 对于那些运行容器的名称必须是唯一的,因此您必须为每个名称定义单独的服务,或者放弃使用container_name.

但是,如果您希望多个开发人员能够使用同一目录中的同一compose 文件运行具有不同名称的容器,那么您将陷入困境。这是因为在启动服务时,docker-compose 有一个Recreating步骤,如果已经有容器实现了该服务,它们将等待该容器完成。最终,我认为这是最好的——如果多个开发人员试图同时运行完全相同的 compose 项目,开发人员是否应该控制其他开发人员正在运行的容器?应该不会吧?

如果您希望多个开发人员能够在同一个 VM 中同时运行服务,我认为您可能想做两件事:

  • 首先,(你很可能已经这样做了!但这仍然是一个很好的提醒)确保这是一个好主意。是否会有资源争用问题(例如端口转发)导致项目的不同运行实例发生冲突?对于许多Docker 服务,会有,但可能不会有,例如。旨在成群运行的图像。
  • 其次,在不同的目录中签出不同的compose文件,以便每个开发人员都有单独的compose项目。要以一种方式使用.env文件,一个明显的选择是只维护单独的副本,每个开发人员目录一个。如果对于您的用例,以.env这种方式为每个开发人员维护一份副本并不令人满意,您可以使用符号链接命名.env(或任何您的 env 文件命名)到 VM 上其他地方的同一文件。

完成此操作后,您将能够从容器名称中分辨出谁在运行什么。

如果这些都不令人满意,您可能需要考虑,例如。每个开发人员使用一个 VM,或者甚至考虑使用与 docker-compose 不同的容器管理系统。


推荐阅读