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

时间:2021-02-04 12:12:42

标签: docker-compose

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

2 个答案:

答案 0 :(得分:1)

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

有两种不同的方式来命名以 docker-compose 开头的内容。一种是命名您在 docker-compose.yml 文件的主 services: 键下指定的 service。默认情况下,单个运行的 容器 将被分配名称,表明它们来自哪个项目(默认情况下,您的 docker-compose 文件所在的目录的名称),它们运行的​​服务(这是在您的 services: 键下指定了什么),以及它们是该服务的哪个实例(例如,如果您使用的是 replica,此数字会发生变化)。例如。在撰写文件 myservice 中指定的名为 ~/my_project/docker/docker-compose.yml 的服务的默认容器名称将具有类似 docker_myservice_1(或 _2_3 等,如果超过应该运行一个容器)。

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

version: "3"

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

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

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

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

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

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

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

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

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

答案 1 :(得分:0)

我已经完成了非常相似的自动化,并且我已经使用 Ansible 即时创建了“docker compose”配置。 因此,基于 input-Environment ,ansible playbook 将创建相关的 docker-compose 文件。所以基本上我在我的 git 存储库中有一个 docker-compose template,其中的值是动态的并且 ansible playbook 填充它们等。

你也可以使用 ansible 一个接一个地触发这样的创建或自动化

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