2014-03-28 180 views
17

我做了一個相當大的Docker容器。當我提交容器來創建圖像時,圖像大約爲7.8 GB。但是當我將容器(不是save的圖像!)export重新導入tarball並重新導入時,圖像只有3 GB大。當然,歷史已經消失了,但對我而言這確實很好,因爲我認爲這個圖像已經「完成」了,並且已經準備好部署。如何拼合Docker鏡像?

如何展平圖像/容器而不將其導出到磁盤並再次導入它?而且:這樣做是明智的主意還是我錯過了一些重要的觀點?

+1

你建立與'''--rm'''選項?這將刪除中間圖像。還是我誤解了這個問題? – shabbychef

+1

還有一些其他技巧可以使圖像變小:在一個'''RUN'''中調用一堆安裝命令,刪除不需要的ubuntu軟件包,_etc._請參閱https://github.com/dckc/ipython-docker/blob/master/Dockerfile就是一個很好的例子。 – shabbychef

回答

15

從Docker 1.13開始,您可以使用--squash標誌。


1.13版本之前:

據我所知,你不能使用泊塢API。 docker exportdocker import是針對這種情況設計的,就像你自己已經提到的那樣。

如果你不想保存到磁盤,你可能會將輸出輸出流管道輸入到輸入流中。我沒有測試過這一點,但嘗試

docker export red_panda | docker import - exampleimagelocal:new 
+0

我剛剛在「Docker version 1.1.1,build bd609d2」上做了這個,所產生的圖像並不小。它實際上有點大。但是新的形象沒有了歷史。 – VolkerK

+0

適用於Docker 17.03.0-ce。從33GB圖像大小減少到19GB –

8

現在Docker已經在17.05發佈了多階段版本,你可以重新格式化喲烏爾構建看起來像這樣:

FROM buildimage as build 
# your existing build steps here 
FROM scratch 
COPY --from=build// 
CMD ["/your/start/script"] 

其結果將是構建環境層在構建服務器緩存,但只有一個扁平的副本將您標記和推動所產生的圖像中存在。


請注意,您通常會重新制定這個複雜的構建環境,只複製幾個目錄。下面是用了一個範例,使從源代碼和一個構建命令單個二進制圖像,而不在主機上安裝圍棋和編譯泊塢窗之外:

$ cat 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"] 

轉到文件是一個簡單的Hello World:

$ cat hello.go 
package main 

import "fmt" 

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

構建既創造環境,構建環境和迷惑不解,然後標籤劃痕一個:

$ docker build -t test-multi-hello .                                
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 
---> Using cache 
---> 5645db256412 
Step 9/9 : CMD /app 
---> Using cache 
---> 8d428d6f7113 
Successfully built 8d428d6f7113 
Successfully tagged test-multi-hello:latest 

望着圖像,只有一個雙進制在圖像中被運,而構建環境是超過700MB:

$ docker images | grep 2630f482fe78 
<none>    <none>    2630f482fe78  6 days ago   700MB 

$ docker images | grep 8d428d6f7113 
test-multi-hello  latest    8d428d6f7113  6 days ago   1.56MB 

是的,它運行:

$ docker run --rm test-multi-hello 
Hello, world. 
+0

這應該是這個時候接受的答案..它非常有效和靈活! –