Ответ 1
Используйте notepad++, перейдите в edit → EOL conversion → измените с CRLF на LF.
Когда я запускаю изображение докеры в окнах 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
Используйте notepad++, перейдите в edit → EOL conversion → измените с CRLF на LF.
изменить точку входа, как показано ниже. У меня сработало
ENTRYPOINT ["sh","/run.sh"]
Как указывалось в комментариях tuomastik, документы требуют, чтобы первым параметром был исполняемый файл:
ENTRYPOINT имеет две формы:
ENTRYPOINT ["executable", "param1", "param2"]
(форма exec, предпочтительно)
ENTRYPOINT command param1 param2
(форма оболочки)
в моем случае мне пришлось изменить строку, заканчивающуюся от CRLF
до LF
для файла run.sh
и ошибка исчезла.
Надеюсь, это поможет,
Кирстен
У меня была такая же проблема при использовании alpine
изображения.
Мой файл .sh
имел следующую первую строку:
#!/bin/bash
Alpine не имеет Bash. Таким образом, изменив строку на
#!/bin/sh
или установка Bash с
apk add --no-cache bash
решил проблему для меня.
Замена CRLF на LF с использованием Notepad++
Перестройте и запустите образ докера, чтобы решить вашу проблему.
Это проблема CRLF. Я исправил проблему с помощью этого:
git config --global core.eol lf
git config --global core.autocrlf input
find . -type f -print0 | xargs -0 dos2unix
Добавьте это в свой Dockerfile
RUN cat /run.sh | tr -d '\r' > /run.sh
"Нет такого файла или каталога" идет из 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
в вашем двоичном файле.