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
PHPzke hadapan
2024-02-09 10:18:29777semak imbas

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"]

Ini nampaknya berfungsi kerana bekas diperiksa selepas membina output

"architecture": "amd64",
"os": "linux"

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

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

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

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

  • Tukar cmd anda untuk merujuk lokasi yang betul:

    cmd ["/foo"]

    atau...

  • Pasang binari dalam /app:

    COPY --from=build /foo ./foo

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam