【问题标题】:docker-compose: start service from same docker-compose file using env vars to alter container namedocker-compose:使用环境变量从同一个 docker-compose 文件启动服务以更改容器名称
【发布时间】: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


【解决方案1】:

与其在docker-compose.yml 中处理变量,不如将--project-name (-p) 选项用于docker-compose 可能更容易。

通常,docker-compose 从包含您的 docker-compose.yaml 文件的目录的名称中派生项目名称。因此,如果两个人尝试从名为 myapp 的目录启动应用程序,他们最终会发生冲突,因为两个实例都将尝试使用相同的名称。

但是,如果他们改为运行:

docker-compose --project-name ${USER}_myapp ...

然后docker-compose 为每个用户使用不同的项目名称(如alice_myappbob_myapp),不会有冲突。

如果人们厌倦了使用-p 选项,他们可以像这样创建.env

COMPOSE_PROJECT_NAME=alice_myapp

这与在命令行中指定-p alice_myapp 的效果相同。

【讨论】:

  • 我实际上更喜欢使用项目名称。问题是 .env 文件不解析环境变量,这意味着我必须使 .env 文件特定于用户,然后我们不能只克隆同一个 repo。指定 p 标志有效,但也不漂亮。每个开发人员都必须考虑如何命名他们现在将运行的容器......
  • 我猜。您可以让开发人员运行一个一次性脚本,执行类似echo COMPOSE_PROJECT_NAME=${USER}_prefix > .env 的操作。
  • 然后 git 会注意到 .env 的变化。如果我们 gitignore 文件,其他设置将无法在团队之间共享。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2020-02-23
  • 2019-07-26
相关资源
最近更新 更多