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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:20:32