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" ]
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?
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!