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.
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" ]
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
Die Verzeichnisstruktur ist
❯ tree . . ├── dockerfile ├── docker-compose.yaml ├── go.mod ├── hello ├── init.go └── start.sh
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 "$@"
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
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
bash
Auf 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
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!