Heim  >  Artikel  >  Backend-Entwicklung  >  Go Binary kann mit dem mehrstufigen Docker-Build nicht ausgeführt werden

Go Binary kann mit dem mehrstufigen Docker-Build nicht ausgeführt werden

王林
王林nach vorne
2024-02-05 23:45:121026Durchsuche

无法使用 docker 多阶段构建执行 go 二进制文件

Frageninhalt

Ich versuche, eine Go-Anwendung wie folgt zu erstellen. Meine main.go-Datei befindet sich in cmd/app/main.go.

Aber wenn ich versuche zu rennen docker build --no-cache .docker 运行 a3f94dbaba3a4609eaf634c1155b4c45 . Es hat mir exec ./bin/app: 没有这样的文件或目录

gegeben

Ich habe das Laufen getestet go build -o ./bin/app ./cmd/app./bin/app und es funktioniert korrekt.

Das ist meine Docker-Datei

# build phase
from golang:1.20 as builder

workdir /app

copy go.mod go.sum ./
run go mod download && go mod verify

copy . .
run go build -o ./bin/app ./cmd/app

# production phase
from alpine:3.14

workdir /app

copy --from=builder /app/bin/app ./bin/app

entrypoint [ "./bin/app" ]

Ich versuche, auf den Container zuzugreifen docker run -it -t fyno/server/multi /bin/sh

/app # cd bin
/app/bin # ls -la
total 11636
drwxr-xr-x    2 root     root          4096 Apr 12 05:04 .
drwxr-xr-x    1 root     root          4096 Apr 12 05:04 ..
-rwxr-xr-x    1 root     root      11904381 Apr 12 05:04 app
/app/bin # ./app
/bin/sh: ./app: not found
/app/bin #

Vielen Dank.

Wie kann dieses Problem gelöst werden?


Richtige Antwort


Zuallererst gibt es ein Problem mit dem Pfad, das den Fehler „Keine solche Datei oder kein solches Verzeichnis“ verursacht. Ich habe ein minimales -Verzeichnis geschrieben. Ich hoffe, dass es jetzt mehr Sinn ergibt.
dockerfile 示例,并重命名了 app 二进制文件,这导致了混乱,因为它位于示例中的 appZweitens, nachdem Sie die Pfadungenauigkeit in

behoben haben, werden Sie beim Versuch, die Go-Binärdatei auszuführen, auf ein subtileres Problem stoßen:

nicht gefundendockerfile, weil das Golang-Builder-Image debian glibc 2.31-13+ deb11u5 2.31 verwendet, while Das Runner-Image verwendet musl libc (x86_64) Version 1.2.2. Die einfachste Lösung besteht darin,

zur Build-Zeit für die Kompilierung festzulegen. Bitte finden Sie Builder- und Runner-Images, die diesbezüglich kompatibel sind.

Für ähnliche Probleme werden cgo_enabled=0 。如果你确实想使用 cgohier
mehrere Alternativen und Workarounds bereitgestellt. Drittens haben Sie in Ihren Kommentaren auch

injizierte Umgebungsvariablen erwähnt.

.
├── cmd
│   └── main.go
├── dockerfile
├── go.mod
└── go.sum
.env 文件,因此我还在 mvp 中添加了一个简单的读取显示,用于使用 docker run --env ...

# build phase
from golang:1.20 as builder
# next line is just for debug
run ldd --version
workdir /build
copy go.mod go.sum ./
run go mod download && go mod verify
copy . .
workdir /build/cmd
run cgo_enabled=0 goos=linux goarch=amd64 go build -o go-binary

# production phase
from alpine:3.14
# next line is just for debug
run ldd; exit 0
workdir /app
copy --from=builder /build/cmd/go-binary .
entrypoint [ "/app/go-binary"]
dockerfile:

package main

import (
    "os"
    "time"

    "github.com/rs/zerolog/log"
)

func main() {
    yourvar := os.getenv("your_var")
    for {
        time.sleep(time.second)
        log.info().msg(yourvar)
    }
}
main.go:Erstellen und ausführen:

docker build --no-cache -t stack-overflow-go-docker:v1.0 .
docker run --env your_var=your-value stack-overflow-go-docker:v1.0
{"level":"info","time":"2023-04-14T21:12:37Z","message":"your-value"}
{"level":"info","time":"2023-04-14T21:12:38Z","message":"your-value"}

Das obige ist der detaillierte Inhalt vonGo Binary kann mit dem mehrstufigen Docker-Build nicht ausgeführt werden. 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