standard_init_linux.go: 190: процес користувача exec спричинив “відсутність такого файлу чи каталогу” - Docker


123

Коли я запускаю образ докера у Windows 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 у файл docker

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

Відповіді:


180

Використовуйте блокнот ++, перейдіть до редагування -> перетворення EOL -> змініть з CRLF на LF.


6
Ідеально! Я додав файл .sh, який запускався з мого Dockerfile. Я замінив закінчення рядків і Ta Da. Дякую
Sweet Chilly Philly

Я не знайшов цю опцію в блокноті ++ на вкладці редагування, але змінив її, натиснувши кнопку праворуч внизу, написану Windows (CR LF), і змінив на Unix. Дуже дякую!
Тобо

У мене така сама проблема, і я вирішую її, як ваша порада. Дуже дякую!
truthblue82

Дякую! Це добре працювало! Я страждав від того самого питання.
Ironrainbow

2
Я отримав цю помилку під час спроби побудови та запуску образів ckan docker у Windows. Якщо ви зіткнулися з цією проблемою в клонованому репо, корисно буде використовувати настройку core.autocrlf під час клонування, якщо так, виконайте: git config core.autocrlf input => (deleted the files from the repo; wasn't sure if git reset would reset the newlines) => git reset --hardСкопійовано з: github.com/LiveOverflow/PwnAdventure3/issues/11
Emil G

71

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

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

Як зазначив tuomastik у коментарях , документація вимагає, щоб першим параметром був виконуваний файл:

ENTRYPOINT має дві форми:

ENTRYPOINT ["executable", "param1", "param2"] (форма виконання, бажана)

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


Працював у мене. У цьому випадку нам навіть не потрібно додавати #! / Bin / sh у сценарій оболонки. Згадка "ш" у ENTRYPOINT робить свою справу
Гуравмой Моханті

10
Чи можете ви пояснити, чому і коли потрібне "ш"? Я бачив багато прикладів роботи без.
Opsse,

1
@Opsse Без "sh", звичайна обробка оболонки не трапляється джерело
tuomastik

2
Виявляється, у своєму скрипті ENTRYPOINT я використовував його /bin/bashяк інтерпретатор оболонки, але оскільки моє зображення базується на альпійській мові, воно з ним не йшло . Я змінив в моєму сценарії bashпо shі проблема вирішена.
morpheuz

63

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

Мій .shфайл містив такий перший рядок:

#!/bin/bash

Альпійський не має баш. Тож зміна рядка на

#!/bin/sh

або встановлення bash за допомогою

apk add --no-cache bash

вирішив питання для мене.


2
Це! Має бути напівжирним шрифтом на сторінці Docker Hub Apline.
hashlock

Так, це все. Якщо ви використовуєте entrypoint.shфайл із Alpineзображенням докера, використовуйте #!/bin/shзамість bash!
Володимир

18

Припустимо, ви стикаєтесь із цією проблемою під час запуску вашого бінарного файлу go в alpine container. Експортуйте наступну змінну перед тим, як будувати свій смітник

# CGO has to be disabled for alpine
export CGO_ENABLED=0

Тоді go build


в Dockerfile це, додайте ENV CGO_ENABLED = 0 перед рядком побудови go. Це спрацювало для мене.
Мадхан Ганеш

тож у Dockerfile це повинно бути:RUN export CGO_ENABLED=0 && go build
BMW

16

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

Сподіваюсь, це допоможе,
Кірстен


1
Я повинен продовжувати виправляти ті самі файли знову і знову. Це як вікна хочуть утримати мене в своїй екосистемі.
Джонатан Читкович

@JonathanCzitkovics, можливо, вам слід перевірити конфігурацію git та налаштування редактора коду
KirKone

9

Це проблема CRLF. Я вирішив проблему за допомогою цього:

git config --global core.eol lf

git config --global core.autocrlf input

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

Дуже дякую! Це врятувало мій день.
Алекс

8

"Жоден такий файл або каталог" не надходить з Linux, і я бачив такі причини:

По-перше, насправді немає файлу всередині контейнера. Деякі люди намагаються запустити команду від хоста, не додаючи її до свого образу. Деякі люди затінюють свою команду, встановлюючи том над командою, яку вони хотіли виконати. Якщо запустити той самий контейнер, але з оболонкою замість звичайного значення точки входу / cmd, і запустити, ls /path/to/cmdви побачите, чи існує це.

Наступною причиною є запуск неправильної команди. Це часто виникає при json / exec форматуванні команди для запуску, яка неправильно аналізується. Якщо ви бачите команду, яка намагається запустити, ["app",або щось подібне, рядок json не був проаналізований Docker, і Linux намагається використовувати оболонку для синтаксичного аналізу команди як рядка. Це також може статися, якщо ви неправильно впорядковуєте аргументи, наприклад, спроба запустити -it- це знак, який ви намагалися розмістити прапори після імені зображення, коли вони повинні бути розміщені перед назвою зображення.

У сценаріях оболонки ця помилка з'являється, якщо перший рядок із #!вказівками на команду, яка не існує всередині контейнера. Для деяких це намагається виконати bashв зображенні, яке лише має /bin/sh. А у вашому випадку це може бути з каналів рядків Windows у сценарії. Перехід на лінійні канали Linux / Unix у вашому редакторі це виправить.

У двійкових файлах ця помилка з'являється, якщо зв'язана бібліотека відсутня. Я часто це бачив, коли команди Go, які компілюються libc, але виконуються на alpine за допомогою muslабо скретч без жодних бібліотек. Вам потрібно або включити всі відсутні бібліотеки, або статично скомпілювати свою команду. Щоб побачити ці посилання на бібліотеку, скористайтеся ldd /your/appвашим двійковим файлом.


3
Дякую! Для мого додатка go в скретч-зображенні довелося відновити за допомогою CGO_ENABLED = 0
Мануель Роні Гомес,

Мій випадок: 1.Виконавчий двійковий файл будується з альпійської версії, але базове зображення, яке запускає команду go, є debian, тому сталася помилка.
inix

6

Я не можу коментувати через свого представника, але я просто хотів додати: для користувачів VSCode ви можете змінити закінчення рядків CRLF на LF, натиснувши CRLF у рядку стану, потім вибрати LF та зберегти файл.

У мене була та сама проблема, і це вирішило її. Кроки для VSCode


4

Заміна CRLF на LF за допомогою Notepad ++

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

Відновіть і запустіть образ докера, щоб вирішити вашу проблему.


3

Зверніть увагу на подібну помилку, таку як:

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

може статися, якщо архітектура, для якої було створено зображення, не відповідає архітектурі вашої системи. Наприклад, спроба запустити зображення, побудоване arm64на x86_64машині, може спричинити цю помилку.


1
Дякую, що написали це. Це змусило мене усвідомити, що я будую з ubuntu і працюю з альпійським та альпійським, мабуть, не вистачає чогось потрібного.
Кіп,


0

Я вирішую цю проблему, встановлюю свої налаштування у vscode.

  1. Файл
    1. Преференції
      1. Налаштування
        1. Текстовий редактор
          1. Файли
          2. Eol - встановлено на \ n

З повагою


0

Я знайшов конкретний крайній випадок, коли я використовував tini init в альпійському контейнері, але оскільки я не використовував статично зв'язану версію, і Alpine використовує musl libc, а не бібліотеку GNU LibC, встановлену за замовчуванням, він збігався з тим самим повідомлення про помилку.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.