Rumah > pembangunan bahagian belakang > Golang > Fail boleh laku golang pelaksanaan imej Docker: exec /usr/local/go/bin/go: ralat format exec

Fail boleh laku golang pelaksanaan imej Docker: exec /usr/local/go/bin/go: ralat format exec

PHPz
Lepaskan: 2024-02-09 10:18:29
ke hadapan
772 orang telah melayarinya

Docker 镜像执行 golang 可执行文件:exec /usr/local/go/bin/go: exec 格式错误

editor php Apple mungkin menghadapi ralat biasa apabila menggunakan Docker: "Fail boleh laku golang pelaksanaan imej Docker: exec /usr/local/go/bin/go: ralat format exec". Ralat ini biasanya disebabkan oleh fail boleh laku golang dalam imej tidak dilaksanakan dengan betul. Terdapat banyak cara untuk menyelesaikan masalah ini, termasuk menyemak kebenaran fail boleh laku golang, menyemak sama ada fail boleh laku boleh diakses, menyemak sama ada laluan ke fail boleh laku adalah betul, dsb. Dengan menyelesaikan masalah ini, anda boleh memastikan bahawa fail boleh laku golang dilaksanakan dengan betul dalam Docker dan meningkatkan kecekapan dan kestabilan pembangunan kod.

Kandungan soalan

Saya tahu bahawa jika go boleh laku hendak dijalankan pada komputer lain, saya perlu menentukan platform sasarannya. Saya sedang membina imej docker pada mesin Apple menggunakan cip m1:

dockerfile

from --platform=linux/amd64 golang:alpine as build

workdir /

add go.mod .
add go.sum .
run go mod download
copy . .
run cgo_enabled=0 goos=linux goarch=amd64 go build -ldflags="-s -w" -o .

from --platform=linux/amd64 scratch

workdir /app
copy --from=build /foo /foo

cmd ["./foo"]
Salin selepas log masuk

Ini nampaknya berfungsi kerana bekas diperiksa selepas membina output

"architecture": "amd64",
"os": "linux"
Salin selepas log masuk

Tapi bila dah guna sekarang docker-compose 在 linux 服务器上启动映像时,出现错误: exec /usr/local/go/bin/go: exec format error

docker-compose.yml

foo:
    environment:
      - PORT=${PORT}
    image: docker.io/name/foo
    platform: linux/amd64
    ports:
      - "8000:8000"
    restart: always
Salin selepas log masuk

Saya agak baru untuk berlabuh, jadi saya rasa saya kehilangan sesuatu yang sangat jelas di sini.

Penyelesaian

Pertama sekali, saya boleh mengesahkan bahawa anda berjaya membina binari amd64, jadi ini bukan isu go.

Jika saya menjalankan imej anda (pada sistem linux amd64) saya tidak mendapat ralat yang sama yang anda laporkan. Memandangkan ini docker-compose.yaml:

foo:
    environment:
      - port=${port}
    image: docker.io/chedched/foo
    platform: linux/amd64
    ports:
      - "8000:8000"
    restart: always
Salin selepas log masuk

Apabila berlari docker-compose up, saya nampak:

error: for images_foo_1  cannot start service foo: failed to create shim task:
oci runtime create failed: runc create failed: unable to start container
process: exec: "./foo": stat ./foo: no such file or directory: unknown
Salin selepas log masuk

Ini berlaku kerana anda menetapkan workdir /app,这使得 app 成为映像中的当前工作目录,但您已将二进制文件安装为 /foo. Anda perlukan:

  • Tukar cmd anda untuk merujuk lokasi yang betul:

    cmd ["/foo"]
    Salin selepas log masuk

    atau...

  • Pasang binari dalam /app:

    COPY --from=build /foo ./foo
    Salin selepas log masuk

    Dengan mana-mana perubahan ini, imej akan berkelakuan seperti yang diharapkan.

    Atas ialah kandungan terperinci Fail boleh laku golang pelaksanaan imej Docker: exec /usr/local/go/bin/go: ralat format exec. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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