【发布时间】:2017-10-05 09:30:13
【问题描述】:
我们在一个开发团队中使用 docker。我们有所有开发人员都在从事的项目。由于我们不希望每个开发人员都有一个docker-compose.yml,因此我们使用环境变量将用户名传递给 docker-compose。在 docker-compose 里面我们有这样的东西
services:
myservice:
image: myimage
container_name: ${user}_myservice
这对我们来说过去工作得很好,但最近停止工作了。假设有两个用户。第一个用户运行 docker-compose up myservice 启动 ${user1}_myservice。当第二个用户发出相同的命令时,第二个用户将终止运行在 ${user1}_myservice 下的容器并启动 ${user2}_myservice。
不知何故,现在 docker 服务似乎直接链接,而不仅仅是像以前那样通过 container_name 变量。
我们最近将 docker 升级到了Docker version 17.09.0-ce, build afdb6d4。我将更改归因于“新”docker 版本。我曾尝试将 docker-compose 降级到以前的版本,似乎这与 docker-compose 无关。
更新
受以下答案的启发,我们找到了以下解决方法:
我们将环境变量COMPOSE_PROJECT_NAME 设置为主机用户登录时的用户名。然后我们将 docker-compose.yml 文件中的服务名称扩展为<proj>_<service>,从而避免跨项目的相同服务名称之间的任何冲突。
【问题讨论】:
-
$user在哪里设置?有一个$USER环境变量,但大小写很重要。17.05.0-ce对我来说很好用;我的平台似乎还没有17.09.0-ce。 -
$user 环境变量在用户登录时运行的 shell 脚本中设置。变量正确传递。容器获得正确的名称。但是相同服务的容器不能再共存,尽管它们有不同的容器名称。
-
docker-compose 为您的应用程序创建一个命名网络。这个网络名称是否相同?如果您在
docker-compose.yaml中设置显式网络怎么办? -
他们确实在同一个网络上。我找到了一个描述生成您自己的网络的来源 (runnable.com/docker/docker-compose-networking)。但在我看来,它不允许使用环境变量更改该网络名称。还是我忽略了什么?
-
我只是在尝试,看起来 docker-compose 在定义网络时没有在网络名称中扩展环境变量。我仍然认为设置项目名称是您最好的解决方案。
标签: docker docker-compose