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
docker
dockerfile
docker-for-windows
gamechanger17
quelle
quelle
git config core.autocrlf input => (deleted the files from the repo; wasn't sure if git reset would reset the newlines) => git reset --hard
Kopiert von: github.com/LiveOverflow/PwnAdventure3/issues/11Ändern Sie den Einstiegspunkt wie unten. Es hat bei mir funktioniert
Wie tuomastik wies darauf hin , in den Kommentaren , die Dokumentation benötigen Sie die ersten Parameter die ausführbare Datei zu sein:
quelle
"sh"
, normale Shell-Verarbeitung findet keine Quelle statt/bin/bash
als Shell-Interpreter verwendet habe, aber da mein Bild alpin basiert, wurde es nicht mitgeliefert . Ich habe mein Skriptbash
durch geändertsh
und das Problem gelöst.Ich hatte das gleiche Problem bei der Verwendung des
alpine
Bildes.Meine
.sh
Datei hatte die folgende erste Zeile:Alpine hat keine Bash. Also ändere die Zeile auf
oder Bash mit installieren
löste das Problem für mich.
quelle
in meinem Fall musste ich Linie vom Endung ändern ,
CRLF
umLF
für dierun.sh
Datei und der Fehler war verschwunden.Ich hoffe das hilft,
Kirsten
quelle
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
Dann
go build
quelle
RUN export CGO_ENABLED=0 && go build
RUN CGO_ENABLED=0 go build
Es ist ein CRLF-Problem. Ich habe das Problem damit behoben:
quelle
"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/cmd
Sie 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,-it
ist 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,bash
in 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 mitmusl
oder ohne Scratch ohne Bibliotheken ausgeführt werden. Sie müssen entweder alle fehlenden Bibliotheken einschließen oder Ihren Befehl statisch kompilieren. Verwendenldd /your/app
Sie diese Binärdatei , um diese Bibliothekslinks anzuzeigen.quelle
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.
quelle
CRLF durch LF mit Notepad ++ ersetzen
Das Docker-Image neu erstellen und ausführen sollte Ihr Problem lösen.
quelle
Beachten Sie einen ähnlichen Fehler wie:
Dies kann passieren, wenn die Architektur, für die ein Image erstellt wurde, nicht mit der Ihres Systems übereinstimmt. Wenn Sie beispielsweise versuchen, ein
arm64
auf einemx86_64
Computer erstelltes Image auszuführen, kann dieser Fehler auftreten.quelle
Fügen Sie dies Ihrer Docker-Datei hinzu
quelle
Ich löse dieses Problem und setze meine Einstellungen in vscode.
Grüße
quelle