go項目dockerfile最佳實踐
1. 前言
這幾天在構建golang編寫的web項目中,關於dockerfile編寫的一些總結
可能是單純我比較菜(大霧
由於go應用在go build
之後會生成一個二進位文件,且Go宣稱自己只需要Linux內核
大多數程式語言都依賴於解釋器,VM和/或系統庫
剛開始我按照常理思考,寫出了如下的dockerfile
, 但是最終docker build
出來的鏡像高達300多M, 這是由於golang
這個基礎鏡像中的工具鏈及其依賴項(git
,mercurial
等)重達幾百MB,而這一部分我們在運行的時候是不需要的
FROM golang:1.14
ENV GO111MODULE=on \
GOPROXY=//goproxy.cn,direct \
GIN_MODE=release \
PORT=80
WORKDIR /app
COPY . .
RUN go build .
EXPOSE 80
ENTRYPOINT ["./toc-generator"]
2. 不需要cgo情況下的最佳實踐
docker有一個基本鏡像叫做scratch,它是一個空的鏡像,在臨時基礎鏡像上運行的應用程式只能訪問內核
至少在容器提供隔離的範圍內
所以此時我們的思路是
- 在
golang
基礎鏡像下build出二進位文件 - 然後使用
scratch
作為運行時的基礎鏡像 - 並且將上一個stage build出來的
二進位文件
和它的相關依賴文件
copy到scratch下
所以我們現在的dockerfile
大概如下
# 打包依賴階段使用golang作為基礎鏡像
FROM golang:1.14 as builder
# 啟用go module
ENV GO111MODULE=on \
GOPROXY=//goproxy.cn,direct
WORKDIR /app
COPY . .
# CGO_ENABLED禁用cgo 然後指定OS等,並go build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build .
# 由於我不止依賴二進位文件,還依賴views文件夾下的html文件還有assets文件夾下的一些靜態文件
# 所以我將這些文件放到了publish文件夾
RUN mkdir publish && cp toc-generator publish && \
cp -r views publish && cp -r assets publish
# 運行階段指定scratch作為基礎鏡像
FROM scratch
WORKDIR /app
# 將上一個階段publish文件夾下的所有文件複製進來
COPY --from=builder /app/publish .
# 為了防止程式碼中請求https鏈接報錯,我們需要將證書納入到scratch中
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/cert
# 指定運行時環境變數
ENV GIN_MODE=release \
PORT=80
EXPOSE 80
ENTRYPOINT ["./toc-generator"]
3. 依賴cgo情況下的最佳實踐
由於需要依賴cgo,所以我們使用scratch
無法滿足需求,我們需要另外一個運行時基礎鏡像alpine
,看下dockerhub
官方的介紹,它也僅僅只有5MB大小
所以替換下基礎鏡像,我們的dockerfile
變成了如下的樣子:
# 打包依賴階段使用golang作為基礎鏡像
FROM golang:1.14 as builder
# 啟用go module
ENV GO111MODULE=on \
GOPROXY=//goproxy.cn,direct
WORKDIR /app
COPY . .
# 指定OS等,並go build
RUN GOOS=linux GOARCH=amd64 go build .
# 由於我不止依賴二進位文件,還依賴views文件夾下的html文件還有assets文件夾下的一些靜態文件
# 所以我將這些文件放到了publish文件夾
RUN mkdir publish && cp toc-generator publish && \
cp -r views publish && cp -r assets publish
# 運行階段指定scratch作為基礎鏡像
FROM alpine
WORKDIR /app
# 將上一個階段publish文件夾下的所有文件複製進來
COPY --from=builder /app/publish .
# 指定運行時環境變數
ENV GIN_MODE=release \
PORT=80
EXPOSE 80
ENTRYPOINT ["./toc-generator"]
參考鏈接
//baijiahao.baidu.com/s?id=1617163590078677512&wfr=spider&for=pc