standard_init_linux.go: 190: Der Exec-Benutzerprozess verursachte "keine solche Datei oder kein solches Verzeichnis" - Docker

108

Wenn ich mein Docker-Image unter Windows 10 ausführe, wird folgende Fehlermeldung angezeigt:

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

Meine Docker-Datei lautet:

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"]

und das Skript beginnt mit #! / 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

Versuchte Methode1: Versucht, #! / Bin / sh in #! / Bin / bash zu ändern, aber den gleichen Fehler zu erhalten.

Versuchte Methode2: Dos2unix in Docker-Datei hinzugefügt

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

Antworten:

153

Verwenden Sie Notepad ++, gehen Sie zu Bearbeiten -> EOL-Konvertierung -> Wechseln Sie von CRLF zu LF.

Vikas Rathore
quelle
4
Perfekt! Ich hatte eine .sh-Datei hinzugefügt, die von meiner Docker-Datei ausgeführt wurde. Ich habe die Zeilenenden und Ta Da ersetzt. Vielen Dank
Sweet Chilly Philly
Ich habe diese Option in Notepad ++ in der Registerkarte "Bearbeiten" nicht gefunden, aber ich habe sie geändert, indem ich auf die Schaltfläche unten rechts in Windows (CR LF) geklickt habe, und ich habe zu Unix gewechselt. Danke vielmals!
Tobo
Ich habe das gleiche Problem und löse es wie Ihr Rat. Vielen Dank!
Truthblue82
Vielen Dank! Es hat gut funktioniert! Ich hatte das gleiche Problem.
Ironrainbow
1
Ich habe diesen Fehler beim Versuch, ckan Docker-Images unter Windows zu erstellen und auszuführen. Wenn Sie bei einem geklonten Repo auf dieses Problem stoßen, kann es hilfreich sein, die Einstellung core.autocrlf während des Klonens zu verwenden. Führen Sie in diesem Fall Folgendes aus: git config core.autocrlf input => (deleted the files from the repo; wasn't sure if git reset would reset the newlines) => git reset --hardKopiert von: github.com/LiveOverflow/PwnAdventure3/issues/11
Emil G
66

Ändern Sie den Einstiegspunkt wie unten. Es hat bei mir funktioniert

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

Wie tuomastik wies darauf hin , in den Kommentaren , die Dokumentation benötigen Sie die ersten Parameter die ausführbare Datei zu sein:

ENTRYPOINT hat zwei Formen:

ENTRYPOINT ["executable", "param1", "param2"] (Ausführungsform, bevorzugt)

ENTRYPOINT command param1 param2 (Schalenform)

Prity
quelle
Hat für mich gearbeitet. In diesem Fall müssen wir nicht einmal #! / Bin / sh im Shell-Skript hinzufügen. Die Erwähnung von "sh" im ENTRYPOINT macht den Job
Gouravmoy Mohanty
9
Können Sie erklären, warum und wann das "sh" notwendig ist? Ich habe viele Beispiele gesehen, ohne die ich gearbeitet habe.
Opsse
1
@Opsse Ohne "sh", normale Shell-Verarbeitung findet keine Quelle statt
tuomastik
1
Es stellt sich heraus, dass ich in meinem ENTRYPOINT-Skript /bin/bashals Shell-Interpreter verwendet habe, aber da mein Bild alpin basiert, wurde es nicht mitgeliefert . Ich habe mein Skript bashdurch geändert shund das Problem gelöst.
Morpheuz
56

Ich hatte das gleiche Problem bei der Verwendung des alpineBildes.

Meine .shDatei hatte die folgende erste Zeile:

#!/bin/bash

Alpine hat keine Bash. Also ändere die Zeile auf

#!/bin/sh

oder Bash mit installieren

apk add --no-cache bash

löste das Problem für mich.

daB0bby
quelle
1
Dies! Sollte auf der Docker Hub-Seite von Apline fett gedruckt sein.
Hashlock
16

in meinem Fall musste ich Linie vom Endung ändern , CRLFum LFfür die run.shDatei und der Fehler war verschwunden.

Ich hoffe das hilft,
Kirsten

KirKone
quelle
1
Ich muss immer wieder dieselben Dateien reparieren. Es ist, als ob Windows mich in seinem Ökosystem halten möchte.
Jonathan Czitkovics
@ JonathanCzitkovics Vielleicht sollten Sie Ihre Git-Konfiguration und die Einstellungen für Ihren Code-Editor
überprüfen
10

Angenommen, Sie haben dieses Problem, während Sie Ihre Go-Binärdatei mit einem alpinen Container ausführen. Exportieren Sie die folgende Variable, bevor Sie Ihren Bin erstellen

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

Dann go build

arulraj.net
quelle
Fügen Sie in Dockerfile ENV CGO_ENABLED = 0 vor der Go-Build-Zeile hinzu. Das hat bei mir funktioniert.
Madhan Ganesh
In Dockerfile sollte es also sein:RUN export CGO_ENABLED=0 && go build
BMW
Das funktioniert auchRUN CGO_ENABLED=0 go build
Alan Sereb
9

Es ist ein CRLF-Problem. Ich habe das Problem damit behoben:

git config --global core.eol lf

git config --global core.autocrlf input

find . -type f -print0 | xargs -0 dos2unix
Amine_Dev
quelle
Vielen Dank! Es hat meinen Tag gerettet.
Alex
8

"Keine solche Datei oder kein solches Verzeichnis" kommt von Linux, und ich habe die folgenden Ursachen gesehen:

Die erste Ursache ist, dass sich die Datei nicht in Ihrem Container befindet. Einige Benutzer versuchen, einen Befehl vom Host aus auszuführen, ohne ihn ihrem Image hinzuzufügen. Einige Leute beschatten ihren Befehl, indem sie ein Volume über den Befehl stellen, den sie ausführen möchten. Wenn Sie denselben Container ausführen, jedoch mit einer Shell anstelle Ihres normalen Einstiegspunkts / cmd-Werts, und einen ausführen, werden ls /path/to/cmdSie sehen, ob dieser vorhanden ist.

Die nächste Ursache ist die Ausführung des falschen Befehls. Dies tritt häufig bei der json / exec-Formatierung des auszuführenden Befehls auf, der nicht korrekt analysiert wird. Wenn ein Befehl ausgeführt wird ["app",oder etwas Ähnliches, wurde die JSON-Zeichenfolge nicht von Docker analysiert, und Linux versucht, den Befehl mithilfe einer Shell als Zeichenfolge zu analysieren. Dies kann auch passieren, wenn Sie die Argumente falsch anordnen. Der Versuch, sie auszuführen, -itist beispielsweise ein Zeichen dafür, dass Sie versucht haben, Flags nach dem Bildnamen zu platzieren, wenn sie vor dem Bildnamen stehen müssen.

Bei Shell-Skripten wird dieser Fehler angezeigt, wenn die erste Zeile mit den #!Befehlen auf einen Befehl verweist, der im Container nicht vorhanden ist. Für einige versucht dies, bashin einem Image zu laufen , das nur hat /bin/sh. In Ihrem Fall kann dies über Windows-Zeilenvorschübe im Skript erfolgen. Wenn Sie in Ihrem Editor zu Linux / Unix-Zeilenvorschüben wechseln, wird dies korrigiert.

Bei Binärdateien wird dieser Fehler angezeigt, wenn eine verknüpfte Bibliothek fehlt. Ich habe dies oft gesehen, wenn Go-Befehle, die mit kompiliert wurden libc, aber auf alpinen mit musloder ohne Scratch ohne Bibliotheken ausgeführt werden. Sie müssen entweder alle fehlenden Bibliotheken einschließen oder Ihren Befehl statisch kompilieren. Verwenden ldd /your/appSie diese Binärdatei , um diese Bibliothekslinks anzuzeigen.

BMitch
quelle
3
Vielen Dank! Für meine Go-Anwendung in Scratch-Image musste mit CGO_ENABLED = 0
Manuel Rony Gomes
Mein Fall: 1. Die ausführbare Binärdatei wurde aus dem alpinen Bereich erstellt, aber das Basis-Image, in dem der Befehl go ausgeführt wird, ist debian, sodass ein Fehler aufgetreten ist.
Inix
5

Ich kann aufgrund meines Vertreters keinen Kommentar abgeben , wollte aber nur hinzufügen: Für VSCode-Benutzer können Sie die CRLF-Zeilenenden in LF ändern, indem Sie in der Statusleiste auf CRLF klicken , dann LF auswählen und die Datei speichern.

Ich hatte das gleiche Problem, und das löste es. Schritte für VSCode

Xelron
quelle
4

CRLF durch LF mit Notepad ++ ersetzen

  1. Die Find / Replace-Funktion von Notepad ++ erfüllt diese Anforderung recht gut. Rufen Sie einfach den Dialog Ersetzen (STRG + H) auf, wählen Sie den erweiterten Suchmodus (ALT + X), suchen Sie nach "\ r \ n" und ersetzen Sie ihn durch "\ n":
  2. Klicken Sie auf Alle ersetzen (ALT + A).

Das Docker-Image neu erstellen und ausführen sollte Ihr Problem lösen.

Rajesh Samson
quelle
3

Beachten Sie einen ähnlichen Fehler wie:

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

Dies kann passieren, wenn die Architektur, für die ein Image erstellt wurde, nicht mit der Ihres Systems übereinstimmt. Wenn Sie beispielsweise versuchen, ein arm64auf einem x86_64Computer erstelltes Image auszuführen, kann dieser Fehler auftreten.

Niedrig
quelle
1
Danke, dass du das geschrieben hast. Es machte mir klar, dass ich mit Ubuntu baute und mit Alpin lief und Alpin fehlte vermutlich etwas Notwendiges.
Kip
1

Fügen Sie dies Ihrer Docker-Datei hinzu

RUN cat /run.sh | tr -d '\r' > /run.sh
Jose Boretto Blengino
quelle
0

Ich löse dieses Problem und setze meine Einstellungen in vscode.

  1. Datei
    1. Einstellungen
      1. die Einstellungen
        1. Texteditor
          1. Dateien
          2. Eol - auf \ n setzen

Grüße

Deusimar Ferreira
quelle