假设我部署了多个容器
init容器运行完成,然后自行关闭。这是他的工作,即做一些事情 预配置的东西然后退出。
在本地运行时,我在桌面工作环境中运行此操作时没有任何问题。
我的问题是它何时部署在我的CI管道中。当我的初始容器完成时...它会关闭整个容器 docker-compose network。 即使我明确地将--exit-code-from设置为我的测试容器。
docker-compose up --exit-code-from test
最终结果是我无法运行我的测试用例到完成,因为退出的init容器正在关闭所有内容。 有人提示我该怎么办?
答案 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 设置停止。