Docker容器无法找到runshortcuts.sh文件的排查求助
问题描述
我编写了一个runshortcuts.sh bash脚本,本地项目根目录下执行./runshortcuts.sh $args完全正常。使用node:14-alpine作为基础镜像,将本地项目根目录映射到容器内的/usr/src/app,且通过ls验证了本地与容器内目录结构一致。但在容器内执行该脚本时,无论直接运行./runshortcuts.sh还是用sh runshortcuts.sh,均提示:
OCI runtime exec failed: exec failed: unable to start container process: exec ./runshortcuts.sh: no such file or directory: unknown
脚本权限为-rwxrwxr-x,容器通过docker-compose up -d启动后状态正常。相关配置如下:
Dockerfile
FROM node:14-alpine WORKDIR /usr/src/app VOLUME /usr/src/app
docker-compose.yaml
services: app: build: context: . dockerfile: Dockerfile ports: - "3000:3000" - "5000:5000" volumes: - .:/usr/src/app tty: true
问题原因
- Alpine镜像默认无bash环境:
node:14-alpine基于轻量的Alpine Linux,默认仅预装ashshell而非bash。若脚本开头的shebang是#!/bin/bash,容器内找不到bash解释器,就会抛出“找不到文件”的误导性错误(实际是找不到解释器,而非脚本本身)。 - Windows换行符不兼容:若脚本在Windows环境下编写,换行符为
CRLF,而Linux容器仅识别LF格式。此时脚本的shebang行会变成#!/bin/bash\r,系统无法识别带回车的路径,同样会触发“找不到文件”错误。
解决方法
修复bash缺失问题
- 方案1:修改脚本shebang为
#!/bin/sh,Alpine自带的ash兼容绝大多数bash基础语法,足以满足一般脚本需求。 - 方案2:在Dockerfile中安装bash,修改后内容如下:
FROM node:14-alpine RUN apk add --no-cache bash WORKDIR /usr/src/app VOLUME /usr/src/app
修复换行符问题
- 将脚本换行符改为LF格式:
- VS Code用户:点击右下角状态栏的
CRLF,切换为LF; - 命令行方式(Linux/macOS或Git Bash):执行
sed -i 's/\r$//' runshortcuts.sh。
- VS Code用户:点击右下角状态栏的
验证操作
修改完成后,重新构建镜像并启动容器:
docker-compose down docker-compose build docker-compose up -d
进入容器执行脚本验证:
docker exec -it <容器名称或ID> ./runshortcuts.sh
内容的提问来源于stack exchange,提问作者Bunny
相关产品推荐
相关产品推荐

