作者:展翅翱翔512 | 来源:互联网 | 2022-11-30 15:45
我花了两天时间才终于找到问题,所以我以为可以分享。我将概述我在这里遇到的问题,然后概述答案中的解决方案。
我Dockerfile
看起来像这样
FROM php:7.2-fpm
COPY custom-docker-php-entrypoint /usr/local/bin/
ENTRYPOINT ["custom-docker-php-entrypoint"]
我custom-docker-php-entrypont
在同一目录中有一个文件。
#!/bin/sh
set -e
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- php "$@"
fi
exec "$@"
然而,当我跑docker-compose up -d
,然后docker-compose logs -f
我的PHP容器显示与失败的exit code 1
话exec user process caused "no such file or directory"
然后,我使用不同的entrypoint命令加载了容器,并使用bash查找内部并确认文件已复制到我期望的位置。
我想:“也许这是许可的事情?” 所以我尝试设置chmod 777 custom-docker-php-entrypoint
,但这也不能解决我的问题。我也尝试使用将其设置为可执行文件chmod -x custom-docker-php-entrypoint
,但这也无济于事。
1> Michael..:
因此,即使日志说“没有这样的文件或目录”,实际的问题(至少在我的情况下)是由于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
在中指定EOL类型 .gitattributes
如果您知道要始终禁用autocrlf的单个存储库,则可以在该存储库的.gitattributes
文件中指定它。只需将以下行添加到您的.gitattributes
文件即可。
* text eol=lf
autocrlf
在Git的配置文件中禁用
导航至计算机上安装Git的文件夹。对我来说,它安装在C:\ProgramData\Git
。config
在文本编辑器中打开。更改autocrlf=true
为autocrlf=false
。
更改现有文件上的EOL字符。
如果您已有需要转换的入口点脚本,或者首先是在Windows中编写入口点脚本,则可以使用最受欢迎的文本编辑器轻松设置EOL类型。我将概述如何在Vim,Notepad ++和Sublime中进行操作,但是通过搜索“ change EOL”和您选择的文本编辑器的名称,应该很容易找出来。
使用Vim
要将行尾更改为与Linux兼容,请执行:set ff=unix
。要更改它们以使其与Windows兼容,请执行:set ff=dos
。
使用记事本++
在菜单栏上单击Edit
,然后转到EOL Conversion
并选择所需的转换。您需要选择Unix (LF)
使其与Linux兼容。
使用崇高
在菜单栏上单击“查看”,然后转到“行尾”,然后从中选择所需的转换。您需要选择Unix
使其与Linux兼容。
从Dockerfile转换EOL字符。
另外,有一个有用的工具dos2unix
,可以将其安装在映像中并用于转换入口点脚本。假设使用apt-get的基于Ubuntu或Debian的映像,可以按以下方式使用它。
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"]