热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Windows上构建Docker映像:Entrypoint脚本“无此文件或目录”

如何解决《在Windows上构建Docker映像:Entrypoint脚本“无此文件或目录”》经验,为你挑选了1个好方法。

我花了两天时间才终于找到问题,所以我以为可以分享。我将概述我在这里遇到的问题,然后概述答案中的解决方案。

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 1exec 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\Gitconfig在文本编辑器中打开。更改autocrlf=trueautocrlf=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的基于UbuntuDebian的映像,可以按以下方式使用它。

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"]


推荐阅读
author-avatar
展翅翱翔512
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有