wake-up-neo.net

standard_init_linux.go: 190: exec Benutzerprozess hat "keine solche Datei oder ein solches Verzeichnis" verursacht - Docker

Wenn ich mein Docker-Image unter Windows 10 starte, erhalte ich folgende Fehlermeldung:

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: Versuchte, #!/Bin/sh in #!/Bin/bash zu ändern, erhielt aber denselben Fehler.

Versuchte Methode2: Dos2unix in Docker-Datei hinzugefügt

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

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

24
Vikas Rathore

einstiegspunkt wie folgt ändern. Es hat für mich funktioniert

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

in meinem Fall musste ich die Zeilenende von CRLF in LF für die run.sh-Datei ändern, und der Fehler war verschwunden.

Ich hoffe das hilft,
Kirsten

9
KirKone

Ich hatte das gleiche Problem bei der Verwendung des Bildes Alpine.

Mein .sh Datei hatte die folgende erste Zeile:

#!/bin/bash

Alpine hat keine Bash. Also ändere die Leitung auf

#!/bin/sh

oder installiere bash mit

apk add --no-cache bash

löste das Problem für mich.

5
daB0bby

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
1
Amine_Dev

Ersetzen von CRLF durch LF mithilfe von Notepad ++

  1. Mit der Find/Replace-Funktion von Notepad ++ wird diese Anforderung ziemlich gut erledigt. Rufen Sie einfach den Ersetzen-Dialog auf (STRG + H), wählen Sie Erweiterter Suchmodus (ALT + X), suchen Sie nach „\ r\n“ und ersetzen Sie mit „\ N“: 
  2. Hit Alle ersetzen (ALT + A)

Erstellen Sie das Docker-Image neu, und führen Sie es aus, um das Problem zu lösen.

1
Rajesh Samson

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

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 spiegeln 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 Eintrittspunkts/cmd-Werts, und einen ls /path/to/cmd Ausführen, werden Sie feststellen, ob dieser existiert.

Die nächste Ursache ist das Ausführen des falschen Befehls. Dies tritt häufig bei der json/exec-Formatierung des auszuführenden Befehls auf, der nicht korrekt analysiert wird. Wenn Sie einen Befehl sehen, der versucht, ["app", Oder ähnliches auszuführen, wurde der json-String nicht von Docker analysiert, und Linux versucht, den Befehl mithilfe einer Shell als String zu analysieren. Dies kann auch passieren, wenn Sie die Argumente falsch anordnen, z. Der Versuch, -it auszuführen, ist ein Zeichen, mit dem Sie versucht haben, Flags nach dem Bildnamen zu platzieren, wenn sie vor dem Bildnamen platziert werden müssen.

Bei Shell-Skripten tritt dieser Fehler auf, wenn die erste Zeile mit dem #! Auf einen Befehl verweist, der im Container nicht vorhanden ist. Für einige ist dies der Versuch, bash in einem Bild auszuführen, das nur /bin/sh Enthält. In Ihrem Fall kann dies über Windows-Zeilenvorschübe im Skript erfolgen. Wenn Sie in Ihrem Editor zu Linux/Unix-Zeilenumbrüchen wechseln, wird dies korrigiert.

Bei Binärdateien tritt dieser Fehler auf, wenn eine verknüpfte Bibliothek fehlt. Ich habe das oft gesehen, wenn Go-Befehle mit libc kompiliert wurden, aber auf Alpine mit musl oder ohne Bibliotheken ausgeführt wurden. Sie müssen entweder alle fehlenden Bibliotheken einschließen oder Ihren Befehl statisch kompilieren. Verwenden Sie ldd /your/app Für Ihre Binärdatei, um diese Bibliothekslinks anzuzeigen.

0
BMitch

Fügen Sie dies Ihrer Dockerfile hinzu

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