standard_init_linux.go: 190: пользовательский процесс exec вызвал "нет такого файла или каталога" - Docker

Когда я запускаю изображение докеры в окнах 10. Я получаю эту ошибку:

standard_init_linux.go:190: exec user process caused "no such file or directory"

мой файл докеров:

FROM openjdk:8

EXPOSE 8080

VOLUME /tmp

ADD appagent.tar.gz /opt/app-agent
ADD services.jar app.jar
ADD run.sh /run.sh

# Install compiler and perl stuff
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y gcc-multilib
RUN apt-get install -y perl

# Install Percona Toolkit
RUN apt-get install --yes percona-toolkit
RUN ["chmod", "+x", "/run.sh"]
ENTRYPOINT ["/run.sh"]

и скрипт начинается с #!/bin/sh

#!/bin/sh
set -e

JAVA_OPTS="-Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/urandom"

if [ "${APPD_APP_NAME}" != "" ]; then
JAVA_AGENT="-javaagent:/opt/app-agent/javaagent.jar
fi

exec java ${JVM_OPTS} ${JAVA_OPTS} ${JAVA_AGENT} -jar /app.jar

Пробовал метод1: Пробовал сменять #!/Bin/sh на #!/Bin/bash, но получал ту же ошибку.

Пробовал метод2: добавлен dos2unix в файл докеров

RUN apt-get install -y dos2unix
RUN dos2unix /run.sh

Ответ 1

Используйте notepad++, перейдите в edit → EOL conversion → измените с CRLF на LF.

Ответ 2

изменить точку входа, как показано ниже. У меня сработало

ENTRYPOINT ["sh","/run.sh"]

Как указывалось в комментариях tuomastik, документы требуют, чтобы первым параметром был исполняемый файл:

ENTRYPOINT имеет две формы:

ENTRYPOINT ["executable", "param1", "param2"] (форма exec, предпочтительно)

ENTRYPOINT command param1 param2 (форма оболочки)

Ответ 3

в моем случае мне пришлось изменить строку, заканчивающуюся от CRLF до LF для файла run.sh и ошибка исчезла.

Надеюсь, это поможет,
Кирстен

Ответ 4

У меня была такая же проблема при использовании alpine изображения.

Мой файл .sh имел следующую первую строку:

#!/bin/bash

Alpine не имеет Bash. Таким образом, изменив строку на

#!/bin/sh

или установка Bash с

apk add --no-cache bash

решил проблему для меня.

Ответ 5

Замена CRLF на LF с использованием Notepad++

  1. Notepad++ Функция поиска/замены прекрасно справляется с этим требованием. Просто вызовите диалог замены (CTRL + H), выберите режим расширенного поиска (ALT + X), найдите "\ r\n" и замените на "\n":
  2. Хит Заменить все (ALT + A)

Перестройте и запустите образ докера, чтобы решить вашу проблему.

Ответ 6

Это проблема CRLF. Я исправил проблему с помощью этого:

git config --global core.eol lf

git config --global core.autocrlf input

find . -type f -print0 | xargs -0 dos2unix

Ответ 7

Добавьте это в свой Dockerfile

RUN cat /run.sh | tr -d '\r' > /run.sh

Ответ 8

"Нет такого файла или каталога" идет из Linux, и я видел следующие причины:

Первой причиной является отсутствие файла внутри вашего контейнера. Некоторые люди пытаются запустить команду с хоста, не добавляя ее в свой образ. Некоторые люди скрывают свою команду, монтируя том поверх команды, которую они хотели запустить. Если вы запустите тот же контейнер, но с оболочкой вместо обычного значения точки входа /cmd и запустите ls/path/to/cmd вы увидите, существует ли он.

Следующая причина - неправильная команда. Это часто появляется при форматировании json/exec команды, которая выполняется неправильно. Если вы видите команду, пытающуюся запустить ["app", или что-то подобное, строка json не была проанализирована Docker, и Linux пытается использовать оболочку для анализа команды как строки. Это также может произойти, если вы -it аргументов, например, попытка запустить -it - это признак того, что вы пытались поместить флаги после имени изображения, когда они должны быть помещены перед именем изображения.

В сценариях оболочки эта ошибка появляется, если в первой строке #! указывает на команду, которая не существует внутри контейнера. Для некоторых это попытка запустить bash в образе, который имеет только /bin/sh. И в вашем случае это может быть из перевода строки Windows в скрипте. Переключение на перевод строки Linux/Unix в вашем редакторе исправит это.

В двоичных файлах эта ошибка появляется, если связанная библиотека отсутствует. Я часто видел это, когда команды Go, которые скомпилированы с libc, но запускаются на alpine с musl или scratch без каких-либо библиотек вообще. Вам нужно либо включить все отсутствующие библиотеки, либо статически скомпилировать вашу команду. Чтобы увидеть эти ссылки на библиотеки, используйте ldd/your/app в вашем двоичном файле.