当一个容器以 docker-compose 停止时,如何停止所有容器?

How to stop all containers when one container stops with docker-compose?

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

有没有办法恢复旧行为?

您是否尝试过您提供的 link 中建议的解决方法?

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

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

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

在这种情况下,使用新的 docker-compose 版本,将您的测试容器更改为具有默认的无操作命令(类似于 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

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

Reference

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

示例用法是 docker-gen tool written in golang which watches for container start events,自动重新生成配置文件。

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

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

您可以使用:

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

如果您的一个容器停止,这将停止所有容器

在您的 docker 组合文件中,将您的 测试驱动程序 容器设置为依赖于其他容器(使用 depends_on 参数)。您的 docker 撰写文件应如下所示:

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 的替代方案。后者也将关闭所有其他容器,如果它们中的任何一个退出(不仅是测试驱动程序)。这取决于您的用例,哪个更合适。