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

Windows10下Docker COPY脚本报错:找不到文件目录的原因及差异解析

问题分析:Windows下Docker执行entrypoint脚本报错"no such file or directory"

核心报错原因

这个错误的本质不是脚本文件真的不存在,而是Windows的换行格式干扰了脚本执行:

  • Linux/macOS系统的文本文件使用LF(换行符)作为换行标记,而Windows默认采用CRLF(回车+换行)格式。
  • 在Windows环境下构建镜像时,COPY指令会把本地CRLF格式的docker-entrypoint.sh直接复制到Linux容器中。
  • 脚本第一行的#!/bin/sh(或#!/bin/bash)会被解析成#!/bin/sh^M(^M是CR字符的显示形式),系统找不到名为/bin/sh^M的解释器,最终抛出"no such file or directory"的错误——看似是脚本找不到,实际是解释器路径被破坏。

Windows与Linux/macOS的关键差异

  • 换行格式差异:
    • Linux/macOS:所有文本文件使用LF换行,完全匹配容器内Linux系统的要求。
    • Windows:默认CRLF换行,复制到Linux容器后,非二进制文件的换行符会直接破坏Shell脚本的执行逻辑。
  • Docker文件处理逻辑差异:
    • 在Linux/macOS上,Docker与本地POSIX兼容的文件系统直接交互,复制文件时不会修改换行符。
    • Windows上,Docker Desktop默认会对挂载或复制的文本文件进行换行符自动转换(用于适配跨系统文件差异),但这种转换会导致Shell脚本格式失效。

可行解决办法

  • 方法1:通过Git配置强制脚本格式
    若用Git管理代码,在仓库根目录创建.gitattributes文件,添加:
    *.sh text eol=lf
    
    强制Shell脚本始终以LF格式存储和检出,避免Windows自动转换换行符。
  • 方法2:在Dockerfile中转换格式
    复制脚本后,用dos2unix工具转换换行符(需确保镜像中已安装该工具,或先安装):
    COPY ./docker-entrypoint.sh /docker-entrypoint.sh
    RUN apt-get update && apt-get install -y dos2unix && dos2unix /docker-entrypoint.sh && rm -rf /var/lib/apt/lists/*
    
  • 方法3:关闭Docker Desktop的自动换行转换
    打开Docker Desktop设置,找到General选项卡,取消勾选Automatically manage line endings(不同版本位置可能略有差异)。

内容的提问来源于stack exchange,提问作者MaxR.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:10:25