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

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

王林
Freigeben: 2024-02-05 23:45:12
nach vorne
1150 Leute haben es durchsucht

无法使用 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 运行 <container_id> . 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" ]
Nach dem Login kopieren

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 #
Nach dem Login kopieren

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
Nach dem Login kopieren
.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"]
Nach dem Login kopieren
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)
    }
}
Nach dem Login kopieren
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
Nach dem Login kopieren
{"level":"info","time":"2023-04-14T21:12:37Z","message":"your-value"}
{"level":"info","time":"2023-04-14T21:12:38Z","message":"your-value"}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage