linux docker 創(chuàng)建鏡像后無法運行

原文鏈接: https://colobu.com/2018/08/13/create-minimal-docker-image-for-go-applications/

應(yīng)該沒有找錯原文鏈接,找了很多,這個應(yīng)該是原文

docker 無法運行 go (使用alpine)

standard_init_linux.go:178: exec user process caused "no such file or directory"


原因:

? ? 本身Go是靜態(tài)編譯的, 對于CGO, 如果設(shè)置CGO_ENABLED=0,則完全靜態(tài)編譯,不會再依賴動態(tài)庫。

? ? 如果設(shè)置CGO_ENABLED=0,并且你的代碼中使用了標(biāo)準(zhǔn)庫的net包的話,有可能編譯好的鏡像無法運行,報sh: /app: not found的錯誤,盡管/app這個文件實際存在,并且如果講基礎(chǔ)鏡像換為centos或者ubuntu的話就能執(zhí)行。

? ? 這是一個奇怪的錯誤,原因在于:默認(rèn)情況下net包會使用靜態(tài)鏈接庫, 比如libc

? ? 知道了原因,解決辦法也很簡單,就是完全靜態(tài)鏈接或者在基礎(chǔ)鏡像中加入libc庫。



解決方法:

? ? (go build -tags netgo -o main main.go)

? ? (CGO_ENABLED=0 go build -o main main.go)

? ? 設(shè)置CGO_ENABLED=0

? ? 編譯是使用純go的net:go build -tags netgo -a -v

? ? 使用基礎(chǔ)鏡像加glibc(或等價庫musl、uclibc), 比如busybox:glibc、alpine +RUN apk add --no-cache libc6-compat、frolvlad/alpine-glibc


? ? 如果代碼中確實必須使用CGO,因為需要依賴一些C/C++的庫。目前沒有對應(yīng)的Go庫可替代, 那么可以使用-extldflags "-static",go tool link help介紹了extldflags的功能:

? ? -extldflags flags

? ? Set space-separated flags to pass to the external linker.

? ? -static means do not link against shared libraries

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容