Golang 很棒俊啼,靜態(tài)編譯十分方便策幼。但是邑时,它也不是 100% 靜態(tài)編譯的,因為它需要依賴glibc ( 標準C運行庫 )特姐。
而 Docker 最常用的 Apline 鏡像晶丘,使用的是 musl 庫,并不能愉快的運行 Go 程序
網上大部分教程都是教你唐含,CGO_ENABLED=0 go build -a -installsuffix cgo浅浮,使用純 Go 編譯,不用 CGO 鏈接 glibc 捷枯,問題就可以解決了滚秩。
但是最麻煩的問題是,你需要引入 C/C++ 庫的時候淮捆,你并不能禁用 CGO 郁油。
幸好 Alpine 有包管理器,所以我們可以很愉快的安裝所需要的庫争剿。(我之前嘗試手動安裝glic和libstdc++已艰,很難弄)
默認的 Golang 官方編譯環(huán)境中,沒有我們所需的 GCC 和 G++ 編譯環(huán)境蚕苇,所以要先安裝 build-base 配置編譯環(huán)境哩掺。
運行鏡像我們也使用 Alpine ,由于 Alpine 極為精簡涩笤,并沒有常用的時區(qū)嚼吞、證書等盒件,會導致不可預料的錯誤。所以我們需要安裝這些東西:
依賴
完整版 Dockerfile 如下:
(使用這個 Dockerfile 時需要將 github.com/zjyl1994/app 替換為自己的包路徑)
FROM golang:1.12.2-alpine3.9 AS builder
RUN apk --no-cache add build-base
COPY . /code
RUN mkdir -p /usr/local/go/src/github.com/test && \
ln -s /code /usr/local/go/src/github.com/test/app && \
cd /usr/local/go/src/github.com/test/app && \
CGO_ENABLED=1 go build -a
FROM alpine:latest
RUN apk --no-cache add tzdata ca-certificates libc6-compat libgcc libstdc++
COPY --from=builder /usr/local/go/src/github.com/test/app/app /app/app
CMD ["/app/app"]