Windows 10 WSL2下Docker构建镜像报错/bin/sh: /usr/bin/create-user.sh: not found
问题排查与解决方案
核心错误原因
报错exit code 127提示/usr/bin/create-user.sh: not found,但COPY和chmod步骤都执行成功,说明文件确实已经被复制到镜像内,问题出在脚本可执行性的兼容问题,常见原因如下:
- 换行符不兼容:Windows/WSL2环境下编辑的shell脚本默认使用Windows的
CRLF(\r\n)换行符,而Alpine镜像内置的shell是ash,无法识别CR字符,会将CR识别为文件名的一部分,导致系统认为脚本不存在。 - shebang解释器不存在:如果
create-user.sh首行写的是#!/bin/bash,Alpine镜像默认没有预装bash,找不到解释器也会抛出「文件不存在」的错误。 - 架构不兼容(极低概率):使用的是
i386架构的基础镜像,如果WSL2是x86_64架构且没有配置跨架构运行环境,也可能出现执行异常。
对应解决方法
- 转换脚本换行符
在WSL2终端的构建工作目录下执行如下命令,将脚本换行符转换为Linux兼容的LF(\n)格式:
# 先安装dos2unix如果没有的话 sudo apt update && sudo apt install -y dos2unix # 转换两个脚本的换行符 dos2unix create-user.sh startup.sh
如果不想安装dos2unix,也可以用sed直接修改:
sed -i 's/\r$//' create-user.sh startup.sh
- 修正shebang行
打开create-user.sh和startup.sh,将首行修改为Alpine内置支持的sh解释器:
#!/bin/sh
如果确实需要使用bash语法,可以在Dockerfile的RUN执行脚本前,先安装bash:
RUN apk add --no-cache bash
- 可选调试步骤
如果修改后还是报错,可以在chmod步骤之后临时加一行调试命令,确认文件状态:
RUN \ chmod +x /usr/bin/create-user.sh && \ chmod +x /usr/bin/startup.sh && \ ls -la /usr/bin/ | grep .sh && \ head -n 5 /usr/bin/create-user.sh
重新构建时就能看到文件是否存在、权限是否正确、首行shebang是否正常。
内容的提问来源于stack exchange,提问作者Yauheni Tsatskin
相关产品推荐
相关产品推荐

