因此,即使日志显示“没有这样的文件或目录”,实际问题(至少在我的情况下)是由于 Windows 和 Linux 上的行尾 (EOL) 字符不同造成的。 Windows 使用CRLF 表示行尾,Unix/Linux 使用LF。
我没有认为这是一个潜在的问题,因为这些文件是从 Github 新克隆的并且最初是在 Linux 上创建的。我不知道的是,在 Windows 上 Git 设置为自动将 EOL 字符转换为 CRLF。
使 Git 保留原始 EOL 字符(禁用 autocrlf)。
有几种方法可以做到这一点。 autocrlf 是决定 git 是否转换行尾的属性名称。您只需要根据需要执行以下选项之一。
对一个命令禁用autocrlf
您可以使用以下内容克隆文件以一次性禁用 autocrlf。
git clone https://github.com/someuser/somerepo --config core.autocrlf=false
在.gitattributes 中指定 EOL 类型
如果您知道要始终禁用 autocrlf 的单个 repo,您可以在该 repo 的 .gitattributes 文件中指定它。只需将以下行添加到您的 .gitattributes 文件中。
* text eol=lf
在 Git 的配置文件中禁用 autocrlf
导航到您机器上安装 Git 的文件夹。对我来说,它安装在C:\ProgramData\Git。在文本编辑器中打开 config。将autocrlf=true 更改为autocrlf=false。
更改现有文件的 EOL 字符。
如果您有需要转换的现有入口点脚本,或者如果您首先在 Windows 中编写入口点脚本,则可以使用最流行的文本编辑器轻松设置 EOL 类型。我将概述如何在 Vim、Notepad++ 和 Sublime 中执行此操作,但通过搜索“更改 EOL”和您选择的文本编辑器的名称应该很容易弄清楚。
使用 Vim
要将行尾更改为与 Linux 兼容,请执行 :set ff=unix。要更改它们以使其与 Windows 兼容,请执行:set ff=dos。
使用记事本++
在菜单栏上单击Edit,然后转到EOL Conversion 并选择所需的转换。您需要选择 Unix (LF) 以使其与 Linux 兼容。
使用崇高
在菜单栏上单击“查看”并转到“行尾”,然后从那里选择所需的转换。您需要选择 Unix 以使其与 Linux 兼容。
从 Dockerfile 转换 EOL 字符。
另外,还有一个名为dos2unix 的有用工具,您可以将其安装在映像中并用于转换入口点脚本。假设基于 Ubuntu 或 Debian 的映像使用 apt-get ,您可以通过以下方式使用它。
FROM php:7.2-fpm
RUN apt-get update && \
apt-get install -y dos2unix
COPY custom-docker-php-entrypoint /usr/local/bin/
RUN dos2unix /usr/local/bin/custom-docker-php-entrypoint
ENTRYPOINT ["custom-docker-php-entrypoint"]
如果你的 Docker 镜像是基于 Alpine linux 使用 apk 作为包管理器,你会想要做这样的事情,
FROM alpine:latest
RUN apk --update add bash && \
apk add dos2unix
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
如果你的 Docker 镜像是基于 Centos 使用 yum 作为包管理器,你会想要做这样的事情,
FROM centos:latest
RUN yum update -y && \
yum install dos2unix -y
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]