如何在不同的生命周期环境中运行 docker-compose(比如 dev、qa、staging、production)。 有时,多个开发人员共享更大的 VM,因此希望使用适当的开发人员特定后缀(例如 dev1、dev2、dev3 ..)启动容器。是否应该通过环境文件(即 .env 文件)手动处理端口自定义
答案 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 中同时运行服务,我认为您可能需要做两件事:
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 集群