当一个容器停靠时使用docker-compose时如何停止所有容器?

时间:2015-11-19 09:30:17

标签: selenium docker docker-compose

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

有没有办法恢复旧行为?

4 个答案:

答案 0 :(得分:57)

您可以使用:

  

docker-compose up --abort-on-container-exit

如果其中一个容器停止,将停止所有容器

答案 1 :(得分:5)

您是否尝试过在您提供的链接上建议的工作?

假设您的测试脚本与此类似:

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

当应用程序测试结束时,compose将退出并且测试结束。

在这种情况下,使用新的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可以从测试运行中获取退出状态,并且只能看到测试的输出(不是所有依赖项)。

Reference

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

一个示例用法是使用golang docker-gen编写的watches for container start events工具来自动重新生成配置文件。

答案 2 :(得分:4)

在docker compose文件中,将您的 test driver 容器设置为依赖于其他容器(带有depends_on参数)。您的docker compose文件应如下所示:

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 answer的替代方法。如果其他容器退出,后者还将关闭所有其他容器(不仅是 test driver )。这取决于您的用例,哪一种比较合适。

答案 3 :(得分:0)

我不确定这是您问题的完美答案,但是对于Docker maestro,您可以将多个Docker容器作为单个单元进行管理。

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