Docker compose 如何在不同的生命周期环境中运行docker compose

Docker compose 如何在不同的生命周期环境中运行docker compose,docker-compose,Docker Compose,如何在不同的生命周期环境中运行docker compose(如开发、qa、登台、生产)。 有时,一个更大的VM由多个开发人员共享,因此希望使用适当的开发人员特定后缀(比如dev1、dev2、dev3…)启动容器。端口定制是否应该通过环境文件(即.env文件)手动处理?这对于docker compose来说是一个不寻常的用例,但我还是要留下一些提示!) 从docker compose开始,有两种不同的命名方法。一种是命名docker-compose.yml文件的主services:键下指定的服务。

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

这对于docker compose来说是一个不寻常的用例,但我还是要留下一些提示!)

从docker compose开始,有两种不同的命名方法。一种是命名docker-compose.yml文件的主
services:
键下指定的服务。默认情况下,将为各个正在运行的容器分配名称,指示它们来自哪个项目(默认情况下,docker compose文件所在目录的名称)、它们运行的服务(这是在
服务:
键下指定的内容)以及它们是该服务的哪个实例(如果您使用的是
replica
s,则此数字会发生变化)。例如,在编写文件
~/my\u project/docker/docker compose.yml
中指定的名为
myservice
的服务的默认容器名称将类似于
docker\u myservice\u 1
(或者如果要运行多个容器,
\u 2
\u 3
,等等)

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

version: "3"

services:
  ${ENVVAR}:
    image: ubuntu:20.04
但是,您可以通过使用docker compose文件(供使用的文档)中的
container\u name
字段来覆盖容器命名方案。您可以使用如下解决方案:

version: "3"
services:
  myservice:
    image: ubuntu:20.04
    container_name: ${DEVELOPER_ENVVAR?err}
这需要开发人员在运行时指定developer_ENVVAR,方法是将其导出到shell中,或运行docker compose,如
developer_ENVVAR=myservice\u dev1 docker compose up
。请注意,使用容器名称与使用副本为同一服务运行多个容器不兼容-名称必须为ungique用于运行容器,因此您必须为每个名称定义单独的服务,或者放弃使用
container\u name

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

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

  • 首先,(您可能已经这样做了!但这仍然是一个很好的提醒)确保这是一个好主意。是否会出现资源争用问题(例如端口转发)这会使项目的不同运行实例发生冲突吗?对于许多Docker服务来说,将会有,但对于打算在群中运行的图像来说,可能不会有
  • 第二,在不同的目录中签出不同的撰写文件,以便每个开发人员都有单独的撰写项目。要使用
    .env
    文件,一种明显的方法是只维护单独的副本,每个开发人员目录一个副本。如果在您的用例中,维护
    .env的一个副本并不令人满意e> 通过这种方式,每个开发人员都可以使用名为
    .env
    (或您的env文件名)的符号链接到VM上其他地方的同一文件
完成此操作后,您将能够从容器名称中判断谁在运行什么


如果没有一个是令人满意的,您可能需要考虑,例如使用每个开发人员的一个VM,或者甚至考虑使用不同的容器管理系统,而不是DOCKER COMPOSE。

< P>我已经做了非常类似的自动化,并且我已经使用ANNESS创建了“DOCKER COMPOSE”CONFIG。 因此,基于输入环境,ansible playbook将创建相关的docker compose文件。因此,基本上我在git存储库中有一个docker compose
模板
,其中的值是动态的,ansible playbook会填充这些值,等等

您还可以使用ansible一个接一个地触发此类创建或自动化

类似的示例已发布在存储库中。 基本上,整个项目是从CSV文件自动化端到端docker集群