news 2026/9/11 23:10:09

如何用 docker compose up --exit-code-from 把服务容器退出码传递给调用方?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 docker compose up --exit-code-from 把服务容器退出码传递给调用方?

如何用 docker compose up --exit-code-from 把服务容器退出码传递给调用方?

【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/compose

docker compose up在默认行为下会把执行错误统一收敛为退出码1,被SIGINT/SIGTERM中断时为0,调用方(CI 脚本、编排系统、上层 shell 逻辑)无法据此区分到底是哪个业务服务失败、以及失败的具体原因。--exit-code-from SERVICE选项解决的就是这个问题:让up命令把指定服务容器的退出码原样返回给调用方,命令本身的退出码就等于该容器进程实际exit时使用的码值。

准备条件

需要一个 Compose 文件,其中至少包含一个会自行退出的目标服务。仓库中的 e2e 测试 fixture TestUpExitCodeFrom/compose.yaml 给出了一份可直接照搬的示例结构:一个长驻服务safesleep infinity,永不退出)和一个会失败的一次性任务服务failureexit 42):

services: safe: image: 'alpine' init: true command: ['/bin/sh', '-c', 'sleep infinity'] # never exiting failure: image: 'alpine' init: true command: ['/bin/sh', '-c', 'sleep 1 ; echo "exiting with error" ; exit 42']

把示例中exit 42换成你的真实作业命令即可,服务名、镜像和命令都属于需要按实际情况替换的值。

执行:指定服务并检查命令退出码

在 Compose 文件所在目录执行:

$ docker compose up --exit-code-from=failure failure

说明:

  • --exit-code-from的参数是 Compose 文件中的服务名string类型),指定后up会返回该服务容器的退出码。
  • 该选项隐含--abort-on-container-exit:任一容器退出即停止全部容器,因此不能与-d/--detach搭配(见 docs/reference/compose_up.md 的选项表)。
  • 末尾位置参数failure用来限定只启动该服务;不传位置参数时启动整个项目。
  • --exit-code-from会隐含--abort-on-container-exit,按 cmd/compose/up.go 中的参数校验,以下组合会被直接拒绝:
    • --detach-d)与--abort-on-container-exit不兼容;
    • --wait--abort-on-container-exit--attach--attach-dependencies不兼容;
    • --abort-on-container-failure--abort-on-container-exit不能同时使用。

结果验证

命令退出后,用 shell 的$?读取退出码:

$ docker compose up --exit-code-from=failure failure $ echo $? 42

判断标准以仓库 e2e 测试 TestUpExitCodeFrom 为准:该测试执行up --exit-code-from=failure failure后断言命令退出码为42,即与failure服务中exit 42的值一致。上文的42是文档测试中的示例值,你的场景中它应等于目标容器实际的退出码。

另一种需要留意的情况:当被监听服务是长驻容器、而中止是由其他容器退出触发的,该长驻容器会被中止流程停止,其观察到的退出码是信号停止产生的码值。仓库测试 TestUpExitCodeFromContainerKilled 中,up --exit-code-from=testtest为长驻服务)在另一服务退出触发中止后,断言命令退出码为143

实现机制(便于排查)

如果想确认退出码从哪里来,可以看 pkg/compose/up.go:captureExitCodeFrom监听容器退出事件,取所选服务第一个退出容器的ExitCode记录为会话退出码,最终通过cli.StatusError把该码返回给进程退出状态;stopOnFirstExit则负责在检测到退出后停止整个应用。

与默认退出码的对照

按 docs/reference/compose_up.md 的说明,不带--exit-code-from时:

  • 过程遇到错误:up退出码为1
  • SIGINT(Ctrl+C)或SIGTERM中断:容器被停止,退出码为0

也就是说,默认情况下调用方只能拿到0/1这类粗粒度信号;使用--exit-code-from后,才能把具体服务的退出码(如上面的42)透传给 CI 或上层编排逻辑,用于精确判断哪一步失败。

参考

  • 命令选项定义:docs/reference/compose_up.md
  • 命令行参数与兼容性校验:cmd/compose/up.go
  • 行为测试与断言:pkg/e2e/compose_up_test.go
  • 示例 Compose 文件:pkg/e2e/testdata/TestUpExitCodeFrom/compose.yaml

【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/compose

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 23:09:35

用LTP构建《红楼梦》知识图谱:NER、SRL与Neo4j全流程

简介:本资源是一套基于知识图谱的《红楼梦》人物关系可视化与智能问答系统完整实现,面向自然语言处理与知识图谱初学者及高校课程设计者,解决古典文学文本中实体识别、关系抽取与结构化知识应用的实际问题。资源共246个文件,包含8…

作者头像 李华
网站建设 2026/9/11 23:09:26

STM32智能导盲拐杖超声波避障方案:从硬件选型到状态机实现

简介:基于STM32的智能导盲拐杖完整开发包,面向嵌入式、物联网及电子类专业学生,可用于毕业设计、课程设计或项目初期演示。包内含全新源码与详细设计文档,代码经测试可直接运行,适合从入门到进阶的开发者学习参考。资源…

作者头像 李华
网站建设 2026/9/11 23:08:18

解决Google Generative AI 403认证错误的完整指南

1. Google Generative AI 403认证错误深度解析 遇到"Request had insufficient authentication scopes"报错时,通常意味着你的API访问令牌(ACCESS_TOKEN)缺少必要的权限范围。这个问题在调用Google Generative AI服务时尤为常见,特别是当开发者…

作者头像 李华
网站建设 2026/9/11 23:08:04

2026企业AI办公工具选型指南:从场景匹配到Agent落地

一、企业选AI办公工具,为什么不能只看功能列表 当前企业在调研AI办公产品时,普遍存在几类典型选型误区:横向对比功能清单数量、优先按席位单价做决策、以消费端产品知名度作为核心判断依据。很多团队上线工具后发现,大量对话类能力…

作者头像 李华