【问题标题】:How to stop all containers when one container stops with docker-compose?当一个容器使用docker-compose停止时如何停止所有容器?
【发布时间】:2016-02-21 08:37:01
【问题描述】:

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

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

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    你可以使用:

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

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

    【讨论】:

    • 我不确定这是否是 方法,但它确实有效,甚至可以继承已停止容器的退出代码。非常简洁的集成测试功能。
    • 不能在分离模式下工作——尽管是“-d”。会喜欢这样的东西,这样如果一个容器发生故障,Docker 也会关闭其所有依赖容器。
    【解决方案2】:

    在您的 docker compose 文件中,将您的 测试驱动程序 容器设置为依赖于其他容器(使用 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 的替代方案。如果其中任何一个退出,后者还将关闭所有其他容器(不仅是测试驱动程序)。这取决于您的用例,哪个更合适。

    【讨论】:

    • 这个建议的方法对我不起作用。 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 日
    • 对我也不起作用。 “depends_on”容器在主容器启动之前启动,但在主容器停止后它们不会停止。
    • 这对于临时运行(即测试)非常有用。是的,它不会关闭其他容器,但对于集成测试,整个环境在运行测试后被丢弃,因此这种清理无关紧要。这个docker docs 上的section 有助于解释三者之间的区别
    【解决方案3】:

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

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

    $ 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 可以让您从测试运行中获取退出状态,并且您只能看到测试的输出(不是所有依赖项)。

    Reference

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

    一个示例用法是使用golangwatches for container start events 编写的这个docker-gen 工具,用于自动重新生成配置文件。

    【讨论】:

    • 非常感谢您的建议。不,我还没有尝试建议的解决方法,老实说,我没有仔细阅读链接,无法理解我面前有一个解决方法!我会尽快尝试的。
    • 另一件重要的事情要知道:遗憾的是,docker-compose run foo 命令没有设置您的foo 服务的别名(docker-compose 1.8.0-rc1)。见github.com/docker/compose/issues/3492#issuecomment-230931596
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多