如何停止所有集装箱时,一个集装箱停靠码头-组成?

直到最近,当一个人为一堆容器执行 docker-compose up时,其中一个已启动的容器停止了,所有的容器都停止了。自从 https://github.com/docker/compose/issues/741以来,情况已经不是这样了,这对我们来说真的很烦人: 我们使用 docker-compose 来运行 selenium 测试,这意味着启动应用服务器,启动 selenium hub + 节点,启动测试驱动程序,然后在测试驱动程序停止时退出。

有什么办法可以让你回到以前的行为吗?

29552 次浏览

你有没有试过在你提供的链接上建议的工作?

假设您的测试脚本看起来类似于下面这样:

$ docker-compose rm -f
$ docker-compose build
$ docker-compose up --timeout 1 --no-build

当应用程序测试结束时,撰写将退出,测试结束。

在这种情况下,使用新的 docker-compose版本,将测试容器更改为默认的 no-op 命令(类似 echo 或 true) ,并按如下方式更改测试脚本:

$ docker-compose rm -f
$ docker-compose build
$ docker-compose up --timeout 1 --no-build -d
$ docker-compose run tests test_command...
$ docker-compose stop

使用 run 允许您从测试运行中获得退出状态,并且您只能看到测试的输出(而不是所有的依赖项)。

参考

如果这是不可接受的,您可以参考 Docker 远程 API,观察容器的 stop事件并对其采取行动。

一个使用的例子是这个 Docker-gen工具写在 golang其中 容器启动事件的表,自动重新生成配置文件。

我不确定这是您的问题的完美答案,但是 大师 for Docker,允许您将多个 Docker 容器作为单个单元进行管理。

当您使用 YAML 文件对它们进行分组时,应该会感觉很熟悉。

你可使用:

码头-组合-终止-集装箱-出口

如果其中一个集装箱停止运行,它将停止所有集装箱

在 docker 组合文件中,将 测试驾驶员容器设置为依赖于其他容器(使用 depends_on参数)。你的文件应该是这样的:

services:
application_server:
...
selenium:
...
test_driver:
entry_point: YOUR_TEST_COMMAND
depends_on:
- application_server
- selenium

用这种方式表示依赖关系时,运行:

docker-compose run test_driver

test_driver集装箱完成后,所有其他集装箱将关闭。



该解决方案是 docker-compose up --abort-on-container-exit 回答的替代方案。如果其中任何容器退出(不仅仅是 测试驾驶员) ,后者还将关闭所有其他容器。这取决于您的用例哪一个更适合。