Таким образом, даже несмотря на то, что в журналах написано «нет такого файла или каталога», реальная проблема (по крайней мере, в моем случае) была связана с различием в символах конца строки (EOL) в Windows и Linux. 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, но это должно быть достаточно легко понять, выполнив поиск «изменить EOL» и имя вашего текстового редактора.
Использование Vim
Чтобы изменить окончания строк для совместимости с Linux, выполните :set ff=unix
. Чтобы изменить их так, чтобы они были совместимы с Windows, выполните :set ff=dos
.
Использование Блокнота ++
В строке меню нажмите Edit
, затем перейдите к EOL Conversion
и выберите нужное преобразование. Вы захотите выбрать Unix (LF)
, чтобы сделать его совместимым с Linux.
Использование Sublime
В строке меню нажмите «Вид» и перейдите к «Концам строк» и выберите желаемое преобразование. Вам нужно выбрать Unix
, чтобы сделать его совместимым с Linux.
Преобразование символов EOL из вашего Dockerfile.
В качестве альтернативы, есть полезный инструмент под названием 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"]