直到最近,当一个人正在为一堆容器执行docker-compose up
并且其中一个已启动的容器停止时,所有容器都被停止了。自https://github.com/docker/compose/issues/741以来不再是这种情况了,这对我们来说真的很烦人:我们使用docker-compose来运行selenium测试,这意味着启动应用服务器,启动selenium hub +节点,启动测试驱动程序,然后在测试时退出司机停下来。
有没有办法恢复旧行为?
答案 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可以从测试运行中获取退出状态,并且只能看到测试的输出(不是所有依赖项)。
如果这是不可接受的,您可以参考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文件对它们进行分组时应该会感到很熟悉。