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

ins*_*itu 37 selenium docker docker-compose

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

有没有办法恢复旧的行为?

Met*_*orm 69

您可以使用:

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

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

  • 我不确定这是否是 _the_ 方式,但它确实有效,甚至可以继承已停止容器的退出代码。用于集成测试的非常简洁的功能。 (4认同)
  • 要确保退出代码与测试容器的退出代码相对应,请使用“--exit-code-from”命令行选项。有关详细信息和链接,请参阅 /sf/answers/3035707531/。 (2认同)

Jak*_*kul 6

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

services:
  application_server:
     ...
  selenium:
     ...
  test_driver:
    entry_point: YOUR_TEST_COMMAND
    depends_on:
      - application_server
      - selenium
Run Code Online (Sandbox Code Playgroud)

使用这种方式表示依赖关系时,运行:

docker-compose run test_driver
Run Code Online (Sandbox Code Playgroud)

test_driver容器完成后,所有其他容器将关闭。



此解决方案是docker-compose up --abort-on-container-exit 答案的替代方案。如果其他任何容器退出,后者还将关闭所有其他容器(不仅仅是测试驱动程序)。这取决于您的用例,哪一种比较合适。

  • 也没有为我工作。'depends_on'容器是在主容器启动之前启动的,但是在主容器停止之后它们不会停止。 (3认同)
  • 这种建议的方法对我不起作用。docker-compose版本docker-compose版本1.22.0,构建f46880f docker-py版本:3.4.1 CPython版本:3.6.4 OpenSSL版本:OpenSSL 1.0.2o 2018年3月27日 (2认同)
  • 这对于临时运行(即测试)非常有用。是的,它不会关闭其他容器,但对于集成测试,运行测试后整个环境都会被丢弃,因此这种清理并不重要。这个[部分](https:// docker 文档上的 docs.docker.com/compose/faq/#whats-the-difference- Between-up-run-and-start )有助于解释三者之间的区别 (2认同)

Vin*_*met 5

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

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

$ docker-compose rm -f
$ docker-compose build
$ docker-compose up --timeout 1 --no-build
Run Code Online (Sandbox Code Playgroud)

当应用程序测试结束时,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 Code Online (Sandbox Code Playgroud)

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

参考

如果这是不可接受的,您可以参考Docker Remote API并观察stop容器的事件并对其进行操作.

一个示例用法是编写这个docker-gen工具,golang其中监视容器启动事件,以自动重新生成配置文件.