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

Docker CMD调用bash脚本串行执行node命令时mjs传参异常如何解决

修复方案

容器内运行脚本报参数格式错误,按以下步骤排查修复即可:

1. 优先解决换行符兼容问题

Windows本地编辑的start.sh默认使用CRLF换行格式,Linux容器内的shell仅识别LF换行,会导致参数尾部被拼接不可见的\r字符,commander.js读取参数时会将带特殊字符的路径识别为非法值,直接抛出格式错误。
修复操作:

  • 本地编辑器将start.sh换行符切换为LF:VSCode可直接点击右下角状态栏的换行标识,选择LF后保存
  • 若直接在Dockerfile中复制本地脚本进镜像,避免使用Windows环境下编辑后未转格式的脚本文件

2. 修正脚本参数传递逻辑

现有脚本存在两处参数传递问题:

  • 第一行node命令的参数写法本身符合commander.js的传参规则,需提前确认容器内/get-secrets.mjs、/secrets-config.json的绝对路径正确,文件具备可读权限;可在该行后追加echo $?打印退出码,返回0代表密钥拉取脚本执行成功
  • 第二行npm run start -p 8000写法错误:npm会将-p识别为npm自身的参数,不会透传给启动的Node服务,给npm脚本透传参数必须加--做分隔,正确写法为npm run start -- -p 8000

修正后完整的start.sh内容:

#!/bin/sh
set -e # 前序命令执行失败直接退出,避免密钥拉取失败时服务异常启动
node /get-secrets.mjs -c /secrets-config.json -t /.env.production
npm run start -- -p 8000

3. 配置镜像内脚本执行权限

脚本复制进镜像后需添加可执行权限,Dockerfile对应配置参考:

COPY start.sh /start.sh
RUN chmod +x /start.sh
CMD ["/start.sh"]

注意CMD需使用数组形式的exec写法,不要写成CMD /start.sh,避免进程信号转发异常。

排查技巧:容器启动报错时,可进入容器手动执行sh -x /start.sh,脚本会逐行打印实际执行的完整命令,可直接看到参数是否携带多余特殊字符,快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:36:18