Docker-compose --exit-code-from被忽略

时间:2018-04-23 04:04:38

标签: docker docker-compose

假设我部署了多个容器

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

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

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

我的问题是它何时部署在我的CI管道中。当我的初始容器完成时...它会关闭整个容器 docker-compose network。 即使我明确地将--exit-code-from设置为我的测试容器。

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

最终结果是我无法运行我的测试用例到完成,因为退出的init容器正在关闭所有内容。 有人提示我该怎么办?

2 个答案:

答案 0 :(得分:0)

这很有趣。是否可以包含撰写文件?也许您定义了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.

答案 1 :(得分:0)

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

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

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

例如,让我们以 mongo-seeding project 和它们的 Dockerfile 为例。为了在完成其工作后保持容器处于活动状态,我想制作自己的 Dockerfile,我将在其中拉取该映像并定义一个自定义 ENTRYPOINT,该自定义 CMD 将首先从mongo 种子图像的原始定义,然后运行 ​​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 设置停止。