golang go path和go mod的區別
go path 所有運行的go文件都要放在gopath文件下, 因為下載下來的包都在這里目錄下可以引用
go path顧名思義,需要一個環境變量 GOPATH
GOPATH/bin 存放項目可執行文件
go mod 他有一套引用機制 無論你的go文件在哪里 都可以引用包
go path方式
#編譯鏡像
FROM golang:1.13.5-alpine3.10 as builder
MAINTAINER TigerwolfC@***.com.cn
WORKDIR /go/src
COPY . .
RUN go build -o myapp
#產物運行鏡像
FROM alpine:latest
WORKDIR /root
COPY --from=builder /go/src/myapp .
EXPOSE 8088
CMD [“./myapp”]
go mod方式
FROM golang:1.13.5-alpine3.10 as builder
#ENV GOPROXY https://goproxy.io
ENV GO111MODULE on
WORKDIR /go/cache
ADD go.mod .
ADD go.sum .
RUN go mod download
WORKDIR /go/release
ADD . .
RUN GOOS=linux CGO_ENABLED=0 go build -ldflags="-s -w" -installsuffix cgo -o myapp main.go
FROM scratch as prod
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=builder /go/release/gin_demo /
COPY --from=builder /go/release/conf ./conf
CMD ["/myapp"]
逐行拆解
首先,這個dockerfile分為builder和final兩部分。
builder選擇了golang:1.13.5-alpine3.10
作為編譯的基礎鏡像,相比于golang:1.13
, 一方面是因為它體積更小,另一方面是我發現golang:1.13
的編譯結果,在alpine:3.10
中會報not found
的錯誤,雖說有人提供了其它的解決方案,但是能直接避免,為啥不避免呢。
WORKDIR /go/src
ADD . .
指定工作目錄,復制代碼
再下面的四行,
ENV GOPROXY https://goproxy.cn
ENV GO111MODULE on
WORKDIR /go/cache
ADD go.mod .
ADD go.sum .
RUN go mod download
復制代碼
是配置了國內的代理,安裝依賴包了。這里用go mod download
的好處是下次構建鏡像文件時,當go.mod
和go.sum
沒有改變時,它是有緩存的,可以避免重復下載依賴包,加快構建。
builder的最后,就是把當前目錄的文件拷過去,編譯代碼了。
RUN GOOS=linux CGO_ENABLED=0 go build -ldflags="-s -w" -installsuffix cgo -o myapp main.go
final選擇了alpine:3.10
,一方面是體積小,只有5m;另一方面也是和構建鏡像的alpine版本保持一致。
接下來幾行沒啥說的,就是把構建結果、配置文件(有的話)和用戶的相關文件拷過去。
最后,設置一個CMD
,完事!
如果你程序的啟動過程比較復雜,或者是要在啟動時根據環境變量的值做不同的操作,那還是寫個shell文件吧