You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dockerfile中带管道符的CMD未将日志转发到pino-pretty的原因排查

Docker CMD数组格式下管道符失效的核心成因
  • 你当前使用的CMD [xxx]写法属于Docker的exec执行模式,这种模式下Docker会直接创建进程执行数组第一个元素对应的可执行文件,后续所有数组元素都会作为原生参数直接传递给该可执行文件,全程不会调用shell环境,也不会做任何shell语法解析。
  • 管道符|是shell提供的语法能力,不属于node命令的合法参数:你写法里的|和pino-pretty实际都会被当成普通参数传给node进程,而node执行目标js文件时默认会忽略未被业务代码处理的传入参数,所以服务能正常启动,但管道的输出转发逻辑完全没有被触发。

如果要在CMD里直接实现管道效果,有两种不需要额外脚本的修正方式:

  1. 改用shell模式写CMD,不需要数组格式:
CMD node --inspect=0.0.0.0:9229 --preserve-symlinks /app/api/dist/server.js | pino-pretty

这种模式Docker会默认用sh -c来执行后面的整条命令,会正常解析shell语法。
2. 保持exec模式,显式指定shell来执行命令:

CMD ["sh", "-c", "node --inspect=0.0.0.0:9229 --preserve-symlinks /app/api/dist/server.js | pino-pretty"]

内容的提问来源于stack exchange,提问作者Alexander Zeitler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:54:03