Docker镜像构建报错:脚本已复制但提示文件未找到
问题分析与解决方案
核心原因:Windows换行符(CRLF)与Linux(LF)不兼容
你遇到的问题本质是Windows系统下创建的脚本文件使用了CRLF换行符,而Alpine Linux镜像中的shell(ash/sh)无法识别这种换行符。当执行脚本时,实际会尝试调用#!/bin/bash^M(^M是CR字符),系统找不到这个带特殊字符的命令,因此提示“文件未找到”——即使ls能看到文件本身。
解决方案
1. 转换本地脚本的换行符为LF
直接修改本地posix-compile.sh的换行符格式:
- VS Code:点击右下角的“CRLF”,切换为“LF”后保存
- Notepad++:选择「编辑」→「文档格式转换」→「转换为UNIX格式」
2. 在Docker构建过程中自动转换换行符
如果无法修改本地文件格式,可在Dockerfile中添加转换步骤:
FROM openjdk:8u171-jdk-alpine RUN apk -U add tini dos2unix # 新增dos2unix工具 WORKDIR /mnt COPY ./ ./ RUN dos2unix ./posix-compile.sh && \ # 转换换行符为LF chmod +x ./posix-compile.sh && \ ls && \ sh ./posix-compile.sh ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.6.0/wait /wait RUN chmod +x /wait EXPOSE 8484 ENTRYPOINT ["tini", "--"] CMD /wait && sh ./posix-launch.sh
3. 适配Alpine的默认shell(可选)
Alpine默认没有bash,你的脚本开头用了#!/bin/bash,虽然sh可以兼容,但更稳妥的做法是:
- 将脚本开头的
#!/bin/bash替换为#!/bin/sh - 或者在Dockerfile中安装bash:
RUN apk add --no-cache bash
4. 关闭Docker Desktop的自动换行符转换
打开Docker Desktop设置→「资源」→「文件共享」,取消勾选“自动转换行尾”选项,避免Docker在共享文件时自动把LF转成CRLF。
验证方法
在Dockerfile的RUN步骤中添加换行符检查命令,确认问题:
RUN cat -A ./posix-compile.sh # 输出中若看到^M字符,说明是换行符问题
内容的提问来源于stack exchange,提问作者arlee
相关产品推荐
相关产品推荐

