Tidak dapat melaksanakan go binari menggunakan binaan berbilang peringkat docker

王林
Lepaskan: 2024-02-05 23:45:12
ke hadapan
1078 orang telah melayarinya

无法使用 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 运行 <container_id> . 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" ]
Salin selepas log masuk

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 #
Salin selepas log masuk

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
Salin selepas log masuk

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"]
Salin selepas log masuk

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)
    }
}
Salin selepas log masuk

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
Salin selepas log masuk
{"level":"info","time":"2023-04-14T21:12:37Z","message":"your-value"}
{"level":"info","time":"2023-04-14T21:12:38Z","message":"your-value"}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan