Создание образов Docker в Windows: сценарий Entrypoint «нет такого файла или каталога» - PullRequest
0 голосов
/ 06 ноября 2018

Я потратил на это два дня, пока, наконец, не разобрался со своей проблемой, поэтому решил поделиться. Я обрисую в общих чертах проблему, с которой я столкнулся, а затем назову решения в ответе.

Мой 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"

test-php | standard_init_linux.go:190: exec user process caused

Затем я загрузил контейнер другой командой точки входа и использовал bash, чтобы заглянуть внутрь и подтвердить, что файл копируется в то место, которое я ожидал.

Я подумал: "Может, это вещь с разрешениями?" поэтому я попытался установить chmod 777 custom-docker-php-entrypoint, но это также не решило мою проблему. Я также попытался установить его на исполняемый файл с chmod -x custom-docker-php-entrypoint, но это также не помогло.

1 Ответ

0 голосов
/ 06 ноября 2018

Таким образом, даже несмотря на то, что в журналах написано «нет такого файла или каталога», реальная проблема (по крайней мере, в моем случае) была связана с различием в символах конца строки (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.

enter image description here

Изменение символов 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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...