0

我们有 1000 多个 python 单元测试,为了有效地运行它们,我们分批并行化它们。每个批次都有自己的 Docker 环境,由核心应用程序和一个 mongo 实例组成。它的设置是这样的:

docker network create --driver bridge ut_network-1

docker network create --driver bridge ut_network-2

docker run -d --name mongo-unittest-1 --network ut_network-1 mongo:3.4.2

docker run -d --name mongo-unittest-2 --network ut_network-1 mongo:3.4.2

docker run untapt_ut --rm --network ut_network-{%} --link mongo-unittest-{%}:db python discover.py

连接字符串是“mongodb://db:27017/mydb”

{%} 是与环境关联的数字 - 因此在 ut_network-1 上,数据库将是 mongo-unittest-1。请注意“db”的别名。

这工作正常,但我读到--link 将被弃用

我认为解决方案就像删除 --link 并设置主机名一样简单:

docker run -d --hostname db --network ut_network-1 mongo:3.4.2

docker run -d --hostname db --network ut_network-2 mongo:3.4.2

docker run untapt_ut --rm --network ut_network-{%} python discover.py

但是,如果我这样做,那么应用程序将找不到 mongo 实例。更远:

  • 我不能使用--name db,因为 Docker 会尝试创建多个名为“db”的容器,这显然是无法做到的(即使它们位于不同的网络上)。
  • mongo 数据库的默认主机名是容器 id 的前几位数字。我的单元测试都从一个假定数据库名为“db”的秘密文件中获取 mongo 数据库字符串。
  • 正如我所说,如果我使用--hostname db核心应用程序找不到 mongo 实例。但是,如果我将容器 id 硬编码为服务器,那么核心应用程序会很好地找到 mongo 实例。
  • 我想保留别名'db',以便单元测试可以使用一个单一的源来获取我不需要弄乱的 mongo 数据库字符串。

这里的文档暗示我可以使用--link。

那么我这样做正确吗?或者如果没有,我应该如何配置 Docker 网络以便我可以创建多个网络并为“db”别名一个“静态”主机名?

任何建议将不胜感激。

提前致谢!

4

1 回答 1

1

是的,链接已被弃用,应避免使用。对于 DNS 发现,我认为主机名会起作用,但我看到的结果与您看到的相同。您可以使用--name db具有唯一容器问题的容器名称,因此出于与您发现的相同原因,我建议您不要这样做。最好的解决方案是直接进入网络别名的目标--network-alias db

docker run -d --network-alias db --network ut_network-1 mongo:3.4.2

docker run -d --network-alias db --network ut_network-2 mongo:3.4.2

docker run untapt_ut --rm --network ut_network-{%} python discover.py
于 2017-08-01T02:23:36.353 回答