当一个容器以 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
使用 运行 允许您从测试 运行 中获取退出状态,并且您只能看到测试的输出(不是所有依赖项)。
如果这不可接受,您可以参考 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
的替代方案。后者也将关闭所有其他容器,如果它们中的任何一个退出(不仅是测试驱动程序)。这取决于您的用例,哪个更合适。
直到最近,当一个人正在为一堆容器做 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
使用 运行 允许您从测试 运行 中获取退出状态,并且您只能看到测试的输出(不是所有依赖项)。
如果这不可接受,您可以参考 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