Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführbare Golang-Datei für Docker-Image-Ausführung: exec /usr/local/go/bin/go: Exec-Formatfehler

Ausführbare Golang-Datei für Docker-Image-Ausführung: exec /usr/local/go/bin/go: Exec-Formatfehler

PHPz
PHPznach vorne
2024-02-09 10:18:29751Durchsuche

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

php-Editor Apple kann bei der Verwendung von Docker auf einen häufigen Fehler stoßen: „Docker-Image-Ausführung Golang-ausführbare Datei: exec /usr/local/go/bin/go: Exec-Formatfehler“. Dieser Fehler wird normalerweise dadurch verursacht, dass die ausführbare Golang-Datei im Image nicht korrekt ausgeführt wird. Es gibt viele Möglichkeiten, dieses Problem zu lösen, einschließlich der Überprüfung der Berechtigungen der ausführbaren Golang-Datei, der Überprüfung, ob auf die ausführbare Datei zugegriffen werden kann, der Überprüfung, ob der Pfad zur ausführbaren Datei korrekt ist usw. Durch die Lösung dieses Problems können Sie sicherstellen, dass ausführbare Golang-Dateien in Docker korrekt ausgeführt werden, und die Effizienz und Stabilität der Codeentwicklung verbessern.

Inhalt der Frage

Ich weiß, dass ich die Zielplattform angeben muss, wenn die ausführbare Datei go auf einem anderen Computer ausgeführt werden soll. Ich erstelle ein Docker-Image auf einem Apple-Computer mit dem m1-Chip:

Docker-Datei

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

Dies scheint zu funktionieren, da der Container nach dem Erstellen der Ausgabe überprüft wird

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

Aber wenn ich es jetzt benutze 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

Ich bin ziemlich neu in Sachen Docker, daher glaube ich, dass mir hier etwas sehr Offensichtliches fehlt.

Problemumgehung

Zunächst einmal kann ich bestätigen, dass Sie die amd64-Binärdatei erfolgreich erstellt haben, es handelt sich also nicht um ein go Problem.

Wenn ich Ihr Image ausführe (auf einem amd64-Linux-System), erhalte ich nicht den gleichen Fehler, den Sie gemeldet haben. In Anbetracht dessen docker-compose.yaml:

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

Beim Laufen docker-compose up sehe ich:

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

Dies geschieht, weil Sie workdir /app,这使得 app 成为映像中的当前工作目录,但您已将二进制文件安装为 /foo festlegen. Du brauchst:

  • Ändern Sie Ihr cmd, um auf den richtigen Standort zu verweisen:

    cmd ["/foo"]

    oder...

  • Binärdateien installieren in /app:

    COPY --from=build /foo ./foo

Bei jeder dieser Änderungen verhält sich das Bild wie erwartet.

Das obige ist der detaillierte Inhalt vonAusführbare Golang-Datei für Docker-Image-Ausführung: exec /usr/local/go/bin/go: Exec-Formatfehler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen