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

Dockerfile构建Node镜像执行script.sh提示not found错误求助

报错原因排查

你遇到的/bin/sh: ./script.sh: not found报错通常由以下几个原因导致:

  • 脚本换行符格式错误:如果你是在Windows环境下编写的script.sh,默认换行符为CRLF,而Linux容器识别的换行符为LF,shebang行#!/bin/bash末尾携带的不可见\r字符会导致系统尝试查找不存在的/bin/bash\r解释器,最终抛出找不到文件的错误。
  • .dockerignore规则拦截:检查你项目根目录的.dockerignore文件,是否配置了*.sh或者script.sh的忽略规则,导致构建过程中脚本没有被复制到镜像内。
  • 基础镜像无bash环境:如果你使用的是node:14-alpine这类精简镜像,默认没有预装bash,也会触发该报错(你当前使用的node:14默认是Debian系镜像,该问题概率较低)。
现有配置校验

你当前的Dockerfile配置无法实现预期的添加主题仓库需求,核心问题是文件复制顺序错误:
你在执行完RUN ./script.sh修改项目配置后,才执行COPY . /app,这一步会把本地项目的文件直接覆盖到镜像内的/app目录,你之前通过脚本修改的所有内容都会被本地未更新的文件覆盖,等于脚本白执行。
另外还存在两个潜在风险:

  1. 如果tm对应的工具是全局依赖,你当前没有提前安装,执行node tm add会报错找不到对应模块。
  2. 脚本中没有给变量加引号,如果主题仓库地址存在空格、特殊字符时会执行失败。
修复方案

第一步:修复脚本问题

  1. 将script.sh的换行符修改为LF格式(VSCode可点击右下角的换行符标识直接切换)。
  2. 优化script.sh内容:
#!/bin/bash
while read p; do
  node tm add "$p"
done <Themes.txt

第二步:调整Dockerfile顺序

FROM node:14
WORKDIR /app
# 提前复制包文件安装依赖,利用Docker层缓存
COPY package*.json /app
RUN npm install
# 若tm为全局工具,在这里补充安装命令:RUN npm install -g 你的tm工具包名
# 复制所有项目文件到镜像内
COPY . /app
# 执行脚本
RUN chmod +x script.sh
RUN bash script.sh
EXPOSE 8000
ENTRYPOINT ["npm", "start"]

使用bash script.sh执行可以绕开shebang的换行符兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:09:04