Warum kann die Datei nach dem Kopieren in den Container nicht gefunden werden?

王林
Freigeben: 2024-02-09 08:24:10
nach vorne
607 Leute haben es durchsucht

Warum kann die Datei nach dem Kopieren in den Container nicht gefunden werden?

php-Editor Yuzai kann bei der Verwendung der Container-Technologie auf ein häufiges Problem stoßen: Dateien können nach dem Kopieren in den Container nicht gefunden werden. Dieses Problem tritt normalerweise bei der Verwendung von Containerisierungsplattformen wie Docker auf. Der Grund kann sein, dass der Dateipfad falsch eingestellt ist oder das Dateisystem im Container nicht mit dem Host übereinstimmt. Es gibt viele Möglichkeiten, dieses Problem zu lösen, z. B. die Verwendung absoluter Pfade oder das Kopieren von Dateien in den Container über einen freigegebenen Ordner. Bevor wir dieses Problem lösen können, müssen wir zunächst die Zuordnungsbeziehung zwischen dem Dateisystem des Containers und dem Dateipfad verstehen und wissen, wie der Dateipfad richtig konfiguriert wird.

Frageninhalt

Ich habe eine Docker-Datei wie unten gezeigt:

from golang:1.19 as builder
workdir /app
copy . .
run cgo_enabled=0 go build -v -o "hello-bin"


#from scratch
from alpine
copy --from=builder /app/hello-bin /app/hello-bin
copy --from=builder /app/start.sh /app/start.sh
workdir /app
entrypoint  [ "./start.sh" ]
Nach dem Login kopieren

Es erstellt einfach eine Binärdatei aus der Hello-World-Go-Datei. Wenn ich jedoch versuche, diesen Container mit den folgenden Docker-Compose-Einstellungen auszuführen, wird exec ./start.sh: no such file or directory angezeigt.

version: "3"

services:
  hello:
    restart: always
    build:
      context: .
      dockerfile: dockerfile
Nach dem Login kopieren

Die Verzeichnisstruktur ist

❯ tree .
.
├── dockerfile
├── docker-compose.yaml
├── go.mod
├── hello
├── init.go
└── start.sh
Nach dem Login kopieren

Deshalb wird start.sh 应通过 copy 加载到 <code>builder 容器中。 . 行也是如此,它应该通过 copy --from=builder /app/start.sh /app/start.sh in den zweiten Behälter weitergeleitet.

Kontext, der Inhalt von start.sh ist wie folgt:

#!/bin/bash

_main() {
  echo "start"
}

_main "$@"
Nach dem Login kopieren

Das Verwirrendste für mich ist, dass, wenn ich es in der Docker-Datei in cmd [ "ls", "-l" ] ändere, es tatsächlich gedruckt wird

awesomeproject3-hello-1  | -rwxr-xr-x    1 root     root       1819562 May 19 02:41 hello-bin
awesomeproject3-hello-1  | -rwxrwxrwx    1 root     root            51 May 19 02:39 start.sh
Nach dem Login kopieren

Wenn ich es in der Docker-Datei in entrypoint [ './hello-bin' ] ,二进制文件也会成功运行。我只是不明白为什么它说没有 ./start.sh ändere.

Update: Inspiriert von @larsks ist mir aufgefallen, dass es wie von Zauberhand funktioniert, wenn ich den Header von ./start.sh von ./start.sh 的标头从 #!/bin/bash 更改为 #!/bin/sh,它会神奇地工作。我仍然很困惑这里的根本问题是什么,如果我想保留 bash 标头,我应该如何修复 docker 文件?

解决方法

发生错误是因为您在 start.sh 中使用了 #!/bin/bash ändere. Ich bin immer noch verwirrt, was hier das zugrunde liegende Problem ist. Wie soll ich die Docker-Datei reparieren, wenn ich die Bash-Header beibehalten möchte?

LösungDer Fehler ist aufgetreten, weil Sie #!/bin/bash in

verwendet haben.

bashAuf dem Alpine-Docker-Image ist Bash standardmäßig nicht installiert. Stattdessen wird die Busybox-Shell verwendet.

Sie können #!/bin/bash 更改为 #!/bin/sh in einem Container installieren. Siehe

Docker: Wie verwende ich Bash mit einem Alpine-basierten Docker-Image? 🎜🎜 🎜Oder Sie können es durch 🎜 ersetzen, wie Sie im Fragekommentar erwähnt haben. 🎜

Das obige ist der detaillierte Inhalt vonWarum kann die Datei nach dem Kopieren in den Container nicht gefunden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage