直到最近,当一个人为一堆容器执行 docker-compose up时,其中一个已启动的容器停止了,所有的容器都停止了。自从 https://github.com/docker/compose/issues/741以来,情况已经不是这样了,这对我们来说真的很烦人: 我们使用 docker-compose 来运行 selenium 测试,这意味着启动应用服务器,启动 selenium hub + 节点,启动测试驱动程序,然后在测试驱动程序停止时退出。
docker-compose up
有什么办法可以让你回到以前的行为吗?
你有没有试过在你提供的链接上建议的工作?
假设您的测试脚本看起来类似于下面这样:
$ docker-compose rm -f $ docker-compose build $ docker-compose up --timeout 1 --no-build
当应用程序测试结束时,撰写将退出,测试结束。
在这种情况下,使用新的 docker-compose版本,将测试容器更改为默认的 no-op 命令(类似 echo 或 true) ,并按如下方式更改测试脚本:
docker-compose
$ 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事件并对其采取行动。
stop
一个使用的例子是这个 Docker-gen工具写在 golang其中 容器启动事件的表,自动重新生成配置文件。
golang
我不确定这是您的问题的完美答案,但是 大师 for Docker,允许您将多个 Docker 容器作为单个单元进行管理。
当您使用 YAML 文件对它们进行分组时,应该会感觉很熟悉。
你可使用:
码头-组合-终止-集装箱-出口
如果其中一个集装箱停止运行,它将停止所有集装箱
在 docker 组合文件中,将 测试驾驶员容器设置为依赖于其他容器(使用 depends_on参数)。你的文件应该是这样的:
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集装箱完成后,所有其他集装箱将关闭。
test_driver
该解决方案是 docker-compose up --abort-on-container-exit 回答的替代方案。如果其中任何容器退出(不仅仅是 测试驾驶员) ,后者还将关闭所有其他容器。这取决于您的用例哪一个更适合。
docker-compose up --abort-on-container-exit