Mic*_*ael 3 windows docker dockerfile docker-compose
我花了两天时间才终于找到问题,所以我以为可以分享。我将概述我在这里遇到的问题,然后概述答案中的解决方案。
我Dockerfile看起来像这样
FROM php:7.2-fpm
COPY custom-docker-php-entrypoint /usr/local/bin/
ENTRYPOINT ["custom-docker-php-entrypoint"]
Run Code Online (Sandbox Code Playgroud)
我custom-docker-php-entrypont在同一目录中有一个文件。
#!/bin/sh
set -e
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- php "$@"
fi
exec "$@"
Run Code Online (Sandbox Code Playgroud)
然而,当我跑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,但这也无济于事。
因此,即使日志说“没有这样的文件或目录”,实际的问题(至少在我的情况下)是由于Windows和Linux上的行尾(EOL)字符不同。Windows使用CRLF表示一行的结尾,而Unix / Linux使用表示一行的结尾LF。
我不认为这是潜在的问题,因为这些文件是从Github刚克隆的,最初是在Linux上创建的。我不知道的是,在Windows上Git设置为自动将EOL字符转换为CRLF。
autocrlf)。有几种方法可以做到这一点。autocrlf是决定git是否转换行尾的属性的名称。您只需要根据需要执行以下选项之一。
autocrlf一个命令您可以使用以下命令克隆文件以将其禁用autocrlf一次。
git clone https://github.com/someuser/somerepo --config core.autocrlf=false
Run Code Online (Sandbox Code Playgroud)
.gitattributes如果您知道要始终禁用autocrlf的单个存储库,则可以在该存储库的.gitattributes文件中指定它。只需将以下行添加到您的.gitattributes文件即可。
* text eol=lf
Run Code Online (Sandbox Code Playgroud)
autocrlf在Git的配置文件中禁用导航至计算机上安装Git的文件夹。对我来说,它安装在C:\ProgramData\Git。config在文本编辑器中打开。更改autocrlf=true为autocrlf=false。
如果您已有需要转换的入口点脚本,或者首先是在Windows中编写入口点脚本,则可以使用最受欢迎的文本编辑器轻松设置EOL类型。我将概述如何在Vim,Notepad ++和Sublime中进行操作,但是通过搜索“ change EOL”和您选择的文本编辑器的名称,应该很容易找出来。
要将行尾更改为与Linux兼容,请执行:set ff=unix。要更改它们以使其与Windows兼容,请执行:set ff=dos。
在菜单栏上单击Edit,然后转到EOL Conversion并选择所需的转换。您需要选择Unix (LF)使其与Linux兼容。
在菜单栏上单击“查看”,然后转到“行尾”,然后从中选择所需的转换。您需要选择Unix使其与Linux兼容。
另外,有一个有用的工具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"]
Run Code Online (Sandbox Code Playgroud)
如果您的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"]
Run Code Online (Sandbox Code Playgroud)
如果您的Docker映像基于Centos,并且使用yum作为软件包管理器,则您需要执行以下操作,
FROM centos:latest
RUN yum update -y && \
yum install dos2unix -y
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1316 次 |
| 最近记录: |