Heim > Artikel > Backend-Entwicklung > Ausführbare Golang-Datei für Docker-Image-Ausführung: exec /usr/local/go/bin/go: Exec-Formatfehler
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.
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.
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!