2017-06-29 127 views
4

隨着Docker的這個new version,引入了多階段構建,至少我從未聽說過它。我現在的問題是,我應該像使用標準的Compose文件一樣使用它嗎?Docker撰寫與多階段構建

我用docker-compose.yaml來啓動容器,其中涉及許多圖像,一個用於Web服務器,一個用於數據庫。有了這個新的多階段構建,我可以使用一個Dockerfile與兩個FROM命令嗎?就是這樣嗎?

這個多階段構建最終會殺死撰寫(因爲圖片較小)?

回答

6

多階段構建不會影響碼頭構成的使用(儘管您可能想用swarm模式使用docker stack deploy來使用構成羣集)。組合仍然需要將多個微服務連接在一起,例如運行一個代理,一些應用程序和一個內存緩存。 Compose還簡化了將所有配置選項傳遞給複雜的Docker鏡像,連接網絡和卷,配置重啓策略,swarm約束等。所有這些都可以通過大量腳本完成,但通過簡單的yaml定義可以使其更容易。

什麼多階段構建替代是一個多步驟構建,您可能有一個應該不同於運行時環境的構建環境。這是運行您的容器的docker-compose配置之前。

流行的例子是一個去二進制。該二進制文件是靜態編譯的,所以它並不需要其他任何東西來運行。但是它的編譯環境更大,因爲它引入了編譯器和各種庫。下面是一個例子hello.go:

package main 
import "fmt" 
func main() { 
     fmt.Printf("Hello, world.\n") 
} 

和相應的Dockerfile:

ARG GOLANG_VER=1.8 
FROM golang:${GOLANG_VER} as builder 
WORKDIR /go/src/app 
COPY . . 
RUN go-wrapper download 
RUN go-wrapper install 

FROM scratch 
COPY --from=builder /go/bin/app /app 
CMD ["/app"] 

兩個FROM線即是Dockerfile是什麼使它成爲一個多級版本。第一行FROM行使用go編譯器創建第一個階段。第二行FROM也是最後一個,這使得它在構建時成爲標記的默認圖像。在這種情況下,該階段是單個二進制文件的運行時間。其他階段都被緩存在構建服務器上,但不會被最終映像複製。如果您需要使用docker build --target=builder .命令構建單件,則可以將構建目標定位到不同的階段。

$ docker build -t test-mult-stage . 
Sending build context to Docker daemon 4.096kB 
Step 1/9 : ARG GOLANG_VER=1.8 
---> 
Step 2/9 : FROM golang:${GOLANG_VER} as builder 
---> a0c61f0b0796 
Step 3/9 : WORKDIR /go/src/app 
---> Using cache 
---> af5177aae437 
Step 4/9 : COPY . . 
---> Using cache 
---> 976490d44468 
Step 5/9 : RUN go-wrapper download 
---> Using cache 
---> e31ac3ce83c3 
Step 6/9 : RUN go-wrapper install 
---> Using cache 
---> 2630f482fe78 
Step 7/9 : FROM scratch 
---> 
Step 8/9 : COPY --from=builder /go/bin/app /app 
---> 96b9364cdcdc 
Removing intermediate container ed558a4da820 
Step 9/9 : CMD /app 
---> Running in 55db8ed593ac 
---> 5fd74a4d4235 
Removing intermediate container 55db8ed593ac 
Successfully built 5fd74a4d4235 
Successfully tagged test-mult-stage:latest 

$ docker images | grep 2630 
<none>   <none>  2630f482fe78 5 weeks ago  700MB 

$ docker images | grep test-mult-stage 
test-mult-stage latest  5fd74a4d4235 33 seconds ago 1.56MB 

注意運行時刻圖像只有1.5 MB,而與編譯器的untaged建設者形象是700MB:

,當你在構建的結果,這將成爲非常重要的。之前爲了獲得相同的空間節省,您需要在docker外部編譯應用程序,並處理docker通常爲您解決的所有依賴性問題。或者,您可以在一個容器中進行構建,將結果複製出該容器,並將該複製的文件用作另一個構建的輸入。多階段構建將第二個選項轉變爲單個可重複和便攜的命令。

4

多階段功能允許您創建臨時版本並提取其文件以用於最終版本。對於例如您需要gcc來構建您的庫,但是您不需要在生產容器中使用gcc。雖然,您可以使用幾行bash腳本來執行多個構建,但多級功能允許您使用單個Dockerfile來完成它。無論您是如何構建它,撰寫只使用您的最終圖像,因此它們無關。