Docker alpine 部署 Go 項目失敗分析

用 docker 基於 alpine 微型鏡像部署 Go 的項目,啓動時報錯 panic: standard_init_linux.go:175: exec user process caused "no such file or directory"

通過 GOOS=linux GOARCH=amd64 go build 來構建是可以的,但是通過 golang 的 docker 鏡像編譯卻不行,對比編譯後的文件發現有貓膩。

本地編譯:

> GOOS=linux GOARCH=amd64 go build
> file xxx
xxx: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

golang docker 編譯:

> docker run --rm -it -v $GOPATH:/go golang:1.7 bash -c 'cd $GOPATH/src/xxx && go build
> file xxx
xxx: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped

問題找到了,一個是靜態鏈接,一個是動態鏈接,動態鏈接的在微型鏡像 alpine 上不支持。

總結

默認 go 使用靜態鏈接,但是在 docker 的 golang 環境中默認是使用動態編譯。
如果想使用 docker 編譯 + alpine 部署,可以通過禁用 cgoCGO_ENABLED=0 來解決。
如果要使用 cgo 可以通過 go build --ldflags “-extldflags -static” 來讓 gcc 使用靜態編譯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章