Rumah > pembangunan bahagian belakang > Golang > Mengapa fail tidak dapat ditemui selepas menyalinnya ke bekas?

Mengapa fail tidak dapat ditemui selepas menyalinnya ke bekas?

王林
Lepaskan: 2024-02-09 08:24:10
ke hadapan
644 orang telah melayarinya

Mengapa fail tidak dapat ditemui selepas menyalinnya ke bekas?

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.

Kandungan soalan

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" ]
Salin selepas log masuk

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
Salin selepas log masuk

Struktur direktori ialah

❯ tree .
.
├── dockerfile
├── docker-compose.yaml
├── go.mod
├── hello
├── init.go
└── start.sh
Salin selepas log masuk

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 "$@"
Salin selepas log masuk

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
Salin selepas log masuk

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

.

bashImej docker Alpine tidak mempunyai bash yang dipasang secara lalai. Ia menggunakan cangkerang Busybox sebaliknya.

Boleh pasang #!/bin/bash 更改为 #!/bin/sh dalam bekas. Lihat

Docker: Bagaimana untuk menggunakan bash dengan imej docker berasaskan Alpine? 🎜🎜 🎜Atau anda boleh menggantikannya dengan 🎜, seperti yang anda nyatakan dalam ulasan soalan. 🎜

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan