editor php Yuzai mungkin menghadapi masalah biasa apabila menggunakan teknologi kontena: fail tidak dapat ditemui selepas ia disalin ke bekas. Masalah ini biasanya berlaku apabila menggunakan platform kontena seperti Docker. Sebabnya mungkin laluan fail ditetapkan dengan tidak betul, atau sistem fail di dalam bekas tidak konsisten dengan mesin hos. Terdapat banyak cara untuk menyelesaikan masalah ini, seperti menggunakan laluan mutlak atau menyalin fail ke dalam bekas melalui folder kongsi. Sebelum menyelesaikan masalah ini, kita perlu terlebih dahulu memahami hubungan pemetaan antara sistem fail kontena dan laluan fail, dan cara mengkonfigurasi laluan fail dengan betul.
Saya mempunyai fail docker seperti yang ditunjukkan di bawah:
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" ]
Ia hanya membina binari daripada fail hello-world go. Walau bagaimanapun, apabila saya cuba menjalankan bekas ini dengan tetapan karang docker berikut, ia menunjukkan exec ./start.sh: no such file or directory
.
version: "3" services: hello: restart: always build: context: . dockerfile: dockerfile
Struktur direktori ialah
❯ tree . . ├── dockerfile ├── docker-compose.yaml ├── go.mod ├── hello ├── init.go └── start.sh
Oleh itu start.sh
应通过 copy 加载到 <code>builder
容器中。 . 行也是如此,它应该通过 copy --from=builder /app/start.sh /app/start.sh
disalurkan ke bekas kedua.
Konteks, kandungan start.sh
adalah seperti berikut:
#!/bin/bash _main() { echo "start" } _main "$@"
Bahagian yang paling mengelirukan bagi saya ialah jika saya menukarnya kepada cmd [ "ls", "-l" ]
dalam fail docker ia sebenarnya mencetaknya
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
Jika saya menukarnya kepada entrypoint [ './hello-bin' ]
,二进制文件也会成功运行。我只是不明白为什么它说没有 ./start.sh
dalam fail docker.
Kemas kini: Diilhamkan oleh @larsks, saya perasan bahawa jika saya menukar pengepala ./start.sh
daripada ./start.sh
的标头从 #!/bin/bash
更改为 #!/bin/sh
,它会神奇地工作。我仍然很困惑这里的根本问题是什么,如果我想保留 bash 标头,我应该如何修复 docker 文件?
发生错误是因为您在 start.sh
中使用了 #!/bin/bash
, ia berfungsi secara ajaib. Saya masih keliru apakah isu asas di sini, bagaimana saya harus membetulkan fail docker jika saya mahu menyimpan pengepala bash?
PenyelesaianRalat berlaku kerana anda menggunakan #!/bin/bash
dalam
bash
Imej docker Alpine tidak mempunyai bash yang dipasang secara lalai. Ia menggunakan cangkerang Busybox sebaliknya.
Boleh pasang #!/bin/bash
更改为 #!/bin/sh
dalam bekas. Lihat
Atas ialah kandungan terperinci Mengapa fail tidak dapat ditemui selepas menyalinnya ke bekas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!