Dockerfile中带管道符的CMD未将日志转发到pino-pretty的原因排查
Docker CMD数组格式下管道符失效的核心成因
- 你当前使用的
CMD [xxx]写法属于Docker的exec执行模式,这种模式下Docker会直接创建进程执行数组第一个元素对应的可执行文件,后续所有数组元素都会作为原生参数直接传递给该可执行文件,全程不会调用shell环境,也不会做任何shell语法解析。 - 管道符
|是shell提供的语法能力,不属于node命令的合法参数:你写法里的|和pino-pretty实际都会被当成普通参数传给node进程,而node执行目标js文件时默认会忽略未被业务代码处理的传入参数,所以服务能正常启动,但管道的输出转发逻辑完全没有被触发。
如果要在CMD里直接实现管道效果,有两种不需要额外脚本的修正方式:
- 改用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
相关产品推荐
相关产品推荐

