Go 的編譯結果基本上只依賴libc(傳言,第三方庫是否依賴那就另當別論了), 所以Docker image 實際可以做的很小
- 使用apline 作為docker 的運行環境產生盡可能小的運行環境
- 國內使用有很多情況下是不能使用golang官網倉庫的,這邊需要使用go mod
- golang 編譯需要一個環境,但是運行的時候并不需要編譯的時候的那些go get的東西,所以需要另外建立一個docker image, 這個docker 使用上一個docker的編譯結果
解決方法的話就是使用docker 的multi stage build, 具體的docker file 如下
# build FROM golang:1.12-alpine AS builder WORKDIR /go/src/App COPY . . # set go mod proxy ENV GO111MODULE=on ENV GOPROXY=https://goproxy.io RUN go build -ldflags "-w -s" # runtime FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ # using build result COPY --from=builder /go/src/app/ . CMD ["./appname"]