原文鏈接: 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