-
build編譯階段
-
certs(可選,可有可無)證書認證階段
-
prod生產階段
1 #
2 # BUILD 階段
3 #
4 FROM golang:1.10 AS build
5
6 # 設定我們應用程式的工作目錄
7 WORKDIR /go/src/github.com/scboffspring/blog-multistage-go
8
9 # 新增所有需要編譯的應用程式碼
10 ADD . .
11
12 # 編譯一個靜態的go應用(在二進位制構建中包含C語言依賴庫)
13 RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .
14
15 # 設定我們應用程式的啟動命令
16 CMD ["./blog-multistage-go"]
-
第4行:使用的基礎映象(golang:1.10)並且我們使用as給當前階段一個別名,也可以使用階段索引來取用前一階段,但這使得它更清晰。
-
第7行:我們將工作目錄設定為Golang基礎映象的預設$GOPATH中的應用程式目錄。
-
第10行:新增我們的應用程式源檔案。
-
第13行:編譯二進位制檔案。使用不同的引數來建立一個完整的靜態庫,因為在生產環境拉取映象時可能不一定需要所有的Golang VM以及C語言庫。
-
第16行:使用設定的命令來啟動應用程式。
docker build -t scboffspring/blog-multistage-go .
docker run --rm -ti -p 8080:8080 \
scboffspring/blog-multistage-go
1 <html itemscope="" itemtype="http://schema.org/WebPage" lang="de-CH">
2 <head>
3 <meta content="text/html; charset=UTF-8"
4 http-equiv="Content-Type">
5 <meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png"
6 itemprop="image"><title>Googletitle>
7 ….
REPOSITORY ... SIZE
scboffspring/blog-multistage-go ... 818MB
1 #
2 # BUILD 階段
3 #
4 FROM golang:1.10 AS build
5
6 # 設定我們應用程式的工作目錄
7 WORKDIR /go/src/github.com/scboffspring/blog-multistage-go
8
9 # 新增所有需要編譯的應用程式碼
10 ADD . .
11
12 # 編譯一個靜態的go應用(在二進位制構建中包含C語言依賴庫)
13 RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .
14
15 # 設定我們應用程式的啟動命令
16 CMD ["./blog-multistage-go"]
17
18
19
20 #
21 # 生產階段
22 #
23 FROM scratch AS prod
24
25 # 從buil階段複製二進位制檔案
26 COPY --from=build /go/src/github.com/scboffspring/blog-multistage-go/blog-multistage-go .
27 CMD ["./blog-multistage-go"]
-
第23行:拉取基礎映象
-
第26行:從/go/src/github.com/scboffspring/blog-multistage-go/blog-multistage-go複製build階段編譯的檔案
-
第27行:使用設定的命令來啟動應用程式
docker build -t scboffspring/blog-multistage-go .
docker run --rm -ti -p 8080:8080 \
scboffspring/blog-multistage-go
REPOSITORY ... SIZE
scboffspring/blog-multistage-go ... 6.65MB
curl localhost:8080
500 - Something bad happened
1 #
2 # BUILD 階段
3 #
4 FROM golang:1.10 AS build
5
6 # 設定我們應用程式的工作目錄
7 WORKDIR /go/src/github.com/scboffspring/blog-multistage-go
8
9 # 新增所有需要編譯的應用程式碼
10 ADD . .
11
12 # 編譯一個靜態的go應用(在二進位制構建中包含C語言依賴庫)
13 RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .
14
15 # 設定我們應用程式的啟動命令
16 CMD ["./blog-multistage-go"]
17
18
19 #
20 # CERTS Stage
21 #
22 FROM alpine:latest as certs
23
24 # Install the CA certificates
25 RUN apk --update add ca-certificates
26
27 #
28 # PRODUCTION STAGE
29 #
30 FROM scratch AS prod
31
32 # 從certs階段複製CA證書
33 COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
34 # 從buil階段複製二進位制檔案
35 COPY --from=build /go/src/github.com/scboffspring/blog-multistage-go/blog-multistage-go .
36 CMD ["./blog-multistage-go"]
-
第23行:我們新的certs階段,使用alpine映象
-
第25行:安裝最新版的CA證書
-
第33行:從certs層複製證書,並儲存為/etc/ssl/certs/ca-certificates.crt
docker build -t scboffspring/blog-multistage-go .
docker run --rm -ti -p 8080:8080 \
scboffspring/blog-multistage-go
REPOSITORY ... SIZE
scboffspring/blog-multistage-go ... 6.89MB
docker build -t scboffspring/blog-multistage-go:build . --target=build
-
https://github.com/scboffspring/blog-multistage-go