Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tidak dapat melaksanakan go binari menggunakan binaan berbilang peringkat docker

Tidak dapat melaksanakan go binari menggunakan binaan berbilang peringkat docker

王林
王林ke hadapan
2024-02-05 23:45:121026semak imbas

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

Kandungan soalan

Saya cuba membina aplikasi go seperti berikut, fail main.go saya terletak di cmd/app/main.go.

Tapi bila dah cuba lari docker build --no-cache .docker 运行 a3f94dbaba3a4609eaf634c1155b4c45 . Ia memberi saya exec ./bin/app: 没有这样的文件或目录

Saya telah menguji berjalan go build -o ./bin/app ./cmd/app./bin/app dan ia berfungsi dengan betul.

Ini ialah fail docker saya

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

Saya cuba mengakses bekas 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 #

Terima kasih.

Bagaimana untuk menyelesaikan masalah ini?


Jawapan betul


Pertama sekali, terdapat beberapa masalah dengan laluan, menyebabkan Tiada fail atau direktori ralat.
Saya menulis direktori dockerfile 示例,并重命名了 app 二进制文件,这导致了混乱,因为它位于示例中的 app minimum. Saya harap ia lebih masuk akal sekarang.

Kedua, selepas membetulkan ketidaktepatan laluan dalam dockerfile, anda akan menghadapi masalah yang lebih halus apabila cuba menjalankan binari go: tidak dijumpai, kerana imej pembina golang menggunakan debian glibc 2.31-13+ deb11u5 2.31 imej pelari menggunakan musl libc (x86_64) Versi 1.2.2.

Pembetulan paling mudah ialah menetapkan cgo_enabled=0 。如果你确实想使用 cgo pada masa binaan untuk kompilasi, sila cari imej pembina dan pelari yang serasi dalam hal ini.
Beberapa alternatif dan penyelesaian disediakan untuk masalah yang sama di sini.

Ketiga, anda juga menyebut .env 文件,因此我还在 mvp 中添加了一个简单的读取显示,用于使用 docker run --env ... menyuntik pembolehubah persekitaran dalam ulasan anda.

.
├── cmd
│   └── main.go
├── dockerfile
├── go.mod
└── go.sum

dockerfile:

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

main.go:

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)
    }
}

Bina dan jalankan:

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

Atas ialah kandungan terperinci Tidak dapat melaksanakan go binari menggunakan binaan berbilang peringkat docker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam