Maison > développement back-end > Golang > le corps du texte

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

PHPz
Libérer: 2024-02-09 10:18:29
avant
733 Les gens l'ont consulté

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"]
Copier après la connexion

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

"architecture": "amd64",
"os": "linux"
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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"]
    Copier après la connexion

    ou...

  • Installer les binaires dans /app : 

    COPY --from=build /foo ./foo
    Copier après la connexion

    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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!