【问题标题】:Docker-compose --exit-code-from is ignoredDocker-compose --exit-code-from 被忽略
【发布时间】:2023-03-12 06:31:02
【问题描述】:

假设我部署了多个容器

  • 初始化
  • 服务1
  • 服务2
  • 分贝
  • 网络
  • 测试

init 容器运行完成,然后自行关闭。那是他的工作,就是做一些 预配置的东西然后退出。

在本地运行时,我在桌面工作环境中运行它没有任何问题。

我的问题是当它部署在我的 CI 管道中时。当我的初始化容器完成时......它会关闭整个 码头工人组成网络。 即使我将 --exit-code-from 明确设置到我的测试容器中。

docker-compose up --exit-code-from test

最终结果是我无法运行我的测试用例以完成它,因为所有东西都被退出的 init 容器关闭。 有人提示我该怎么办?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    这很有趣。是否可以包含撰写文件?也许您定义了depends_on,并且您的 CI 管道使用的 docker 版本处理它的方式与您的开发环境中的不同。

    无论如何,您都想停止使用--exit-code-from,这显然意味着--abort-on-container-exit

    来自https://docs.docker.com/compose/reference/up/

    --abort-on-container-exit  Stops all containers if any container was
                               stopped. Incompatible with -d.
    --exit-code-from SERVICE   Return the exit code of the selected service
                               container. Implies --abort-on-container-exit.
    

    【讨论】:

      【解决方案2】:

      我在尝试将 Cypress 与 MongoDB 种子容器和副本集启动器容器一起运行时遇到了同样的问题。两个 mongo 相关的容器在完成工作后会很快退出,从而触发 --exit-code-from cypress 所暗示的不直观的 --abort-on-container-exit

      对我来说,最简单的解决方案是使用tail -f /dev/null hack。这个想法是,如果您在您不想退出的任何容器完成其实际工作之后运行此命令,它们将挂起,直到另一个容器触发 --abort-on-container-exit 并拉下整个 docker-compose 设置.

      请注意,这不是一个通用的答案:这种方法的缺点是您必须找出原始 CMD 在您无法控制的容器中的内容。

      例如,让我们以mongo-seeding project 和他们的Dockerfile 为例。为了让容器在完成工作后保持活力,我想制作自己的 Dockerfile,我将在其中提取该图像并定义一个自定义 ENTRYPOINT,它将首先从原始定义中运行 CMD mongo-seeding 镜像,然后运行 ​​tail -f /dev/null 以保持容器存活。在他们的 Dockerfile 中,我可以看到 CMD 只是 seed 并且我可以假设它在未来不会改变(好的设计)所以我的 ENTRYPOINT 脚本 entry.sh 可以看起来像这样:

      #!/bin/sh
      seed
      tail -f /dev/null
      

      还有我的 Dockerfile:

      FROM pkosiec/mongo-seeding:3.6.0
      
      ENTRYPOINT [ "/app/scripts/entry.sh" ]
      

      加上 docker-compose 中的相关服务和卷挂载以确保完整性:

        mongo-seed:
          build:
            context: ./mongoSeed
          volumes:
            - ./mongoSeed/data:/app/data
            - ./mongoSeed/scripts:/app/scripts
          working_dir: /app/data
          depends_on:
            - mongodb
      

      这使容器完成其工作,然后挂起,直到 Cypress 退出并导致整个 docker-compose 设置停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 2017-04-18
        • 2022-01-03
        • 1970-01-01
        • 2014-12-11
        • 2020-03-08
        • 1970-01-01
        相关资源
        最近更新 更多