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目录,你之前通过脚本修改的所有内容都会被本地未更新的文件覆盖,等于脚本白执行。
另外还存在两个潜在风险:
- 如果
tm对应的工具是全局依赖,你当前没有提前安装,执行node tm add会报错找不到对应模块。 - 脚本中没有给变量加引号,如果主题仓库地址存在空格、特殊字符时会执行失败。
修复方案
第一步:修复脚本问题
- 将script.sh的换行符修改为LF格式(VSCode可点击右下角的换行符标识直接切换)。
- 优化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
相关产品推荐
相关产品推荐

