Maison >développement back-end >Golang >Fichier exécutable golang d'exécution d'image Docker : exec /usr/local/go/bin/go : erreur de format d'exécution

Fichier exécutable golang d'exécution d'image Docker : exec /usr/local/go/bin/go : erreur de format d'exécution

PHPz
PHPzavant
2024-02-09 10:18:29786parcourir

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

Éditeur php Apple peut rencontrer une erreur courante lors de l'utilisation de Docker : "Fichier exécutable golang d'exécution d'image Docker : exec /usr/local/go/bin/go : erreur de format d'exécution". Cette erreur est généralement causée par le fait que le fichier exécutable Golang dans l'image n'est pas exécuté correctement. Il existe de nombreuses façons de résoudre ce problème, notamment vérifier les autorisations du fichier exécutable golang, vérifier si le fichier exécutable est accessible, vérifier si le chemin d'accès au fichier exécutable est correct, etc. En résolvant ce problème, vous pouvez garantir que les fichiers exécutables Golang sont exécutés correctement dans Docker et améliorer l'efficacité et la stabilité du développement de code.

Contenu de la question

Je sais que si l'exécutable go doit être exécuté sur un autre ordinateur, je dois spécifier sa plateforme cible. Je construis une image docker sur une machine Apple en utilisant la puce m1 :

fichier docker

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

Cela semble fonctionner puisque le conteneur est vérifié après la construction de la sortie

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

Mais quand j'utilise maintenant 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

Je suis assez nouveau sur Docker, donc je pense qu'il me manque quelque chose de très évident ici.

Solution de contournement

Tout d'abord, je peux confirmer que vous avez réussi à construire le binaire amd64, ce n'est donc pas un go problème.

Si j'exécute votre image (sur un système Linux amd64), je n'obtiens pas la même erreur que vous avez signalée. Compte tenu de cela docker-compose.yaml :

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

Lorsque je cours docker-compose up, je vois :

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

Cela arrive parce que vous avez défini workdir /app,这使得 app 成为映像中的当前工作目录,但您已将二进制文件安装为 /foo. Il vous faut :

  • Changez votre cmd pour référencer le bon emplacement :

    cmd ["/foo"]

    ou...

  • Installer les binaires dans /app : 

    COPY --from=build /foo ./foo

Avec chacun de ces changements, l'image se comportera comme prévu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer