3 回答

TA貢獻1942條經(jīng)驗 獲得超3個贊
默認情況下,如果使用net
包,構建可能會生成一個帶有一些動態(tài)鏈接的二進制文件,例如到 libc。您可以通過查看結果來動態(tài)檢查與靜態(tài)鏈接ldd output.bin
我遇到過兩種解決方案:
禁用 CGO,通過
CGO_ENABLED=0
強制使用網(wǎng)絡依賴的 Go 實現(xiàn),netgo via
go build -tags netgo -a -v
,這是針對特定平臺實現(xiàn)的
來自https://golang.org/doc/go1.2:
net 包默認需要 cgo,因為主機操作系統(tǒng)通常必須調解網(wǎng)絡調用設置。但是,在某些系統(tǒng)上,可以在沒有 cgo 的情況下使用網(wǎng)絡,這樣做很有用,例如避免動態(tài)鏈接。新的構建標記 netgo(默認關閉)允許在可能的情況下在純 Go 中構建 net 包。
以上假設唯一的 CGO 依賴項是標準庫的net
包。

TA貢獻1934條經(jīng)驗 獲得超2個贊
我在使用 go 二進制文件時遇到了同樣的問題,在將它添加到我的 docker 文件后我讓它工作了:
RUN apk add --no-cache libc6-compat

TA貢獻1826條經(jīng)驗 獲得超6個贊
來自您的構建機器的 Go 編譯器可能會將您的二進制文件與位于與 Alpine 不同位置的庫鏈接。就我而言,它是在 /lib64 下使用依賴項編譯的,但 Alpine 不使用該文件夾。
FROM alpine:edge AS build
RUN apk update
RUN apk upgrade
RUN apk add --update go=1.8.3-r0 gcc=6.3.0-r4 g++=6.3.0-r4
WORKDIR /app
ENV GOPATH /app
ADD src /app/src
RUN go get server # server is name of our application
RUN CGO_ENABLED=1 GOOS=linux go install -a server
FROM alpine:edge
WORKDIR /app
RUN cd /app
COPY --from=build /app/bin/server /app/bin/server
CMD ["bin/server"]
我正在撰寫有關此問題的文章。您可以在http://kefblog.com/2017-07-04/Golang-ang-docker找到此解決方案的草稿。
- 3 回答
- 0 關注
- 443 瀏覽
添加回答
舉報