我做了一個相當大的Docker容器。當我提交容器來創建圖像時,圖像大約爲7.8 GB。但是當我將容器(不是save
的圖像!)export
重新導入tarball並重新導入時,圖像只有3 GB大。當然,歷史已經消失了,但對我而言這確實很好,因爲我認爲這個圖像已經「完成」了,並且已經準備好部署。如何拼合Docker鏡像?
如何展平圖像/容器而不將其導出到磁盤並再次導入它?而且:這樣做是明智的主意還是我錯過了一些重要的觀點?
我做了一個相當大的Docker容器。當我提交容器來創建圖像時,圖像大約爲7.8 GB。但是當我將容器(不是save
的圖像!)export
重新導入tarball並重新導入時,圖像只有3 GB大。當然,歷史已經消失了,但對我而言這確實很好,因爲我認爲這個圖像已經「完成」了,並且已經準備好部署。如何拼合Docker鏡像?
如何展平圖像/容器而不將其導出到磁盤並再次導入它?而且:這樣做是明智的主意還是我錯過了一些重要的觀點?
從Docker 1.13開始,您可以使用--squash
標誌。
1.13版本之前:
據我所知,你不能使用泊塢API。 docker export
和docker import
是針對這種情況設計的,就像你自己已經提到的那樣。
如果你不想保存到磁盤,你可能會將輸出輸出流管道輸入到輸入流中。我沒有測試過這一點,但嘗試
docker export red_panda | docker import - exampleimagelocal:new
我剛剛在「Docker version 1.1.1,build bd609d2」上做了這個,所產生的圖像並不小。它實際上有點大。但是新的形象沒有了歷史。 – VolkerK
適用於Docker 17.03.0-ce。從33GB圖像大小減少到19GB –
構建具有--squash
標誌圖像:
還要考慮掃蕩不需要的文件,如容易緩存:
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
現在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.
這應該是這個時候接受的答案..它非常有效和靈活! –
你建立與'''--rm'''選項?這將刪除中間圖像。還是我誤解了這個問題? – shabbychef
還有一些其他技巧可以使圖像變小:在一個'''RUN'''中調用一堆安裝命令,刪除不需要的ubuntu軟件包,_etc._請參閱https://github.com/dckc/ipython-docker/blob/master/Dockerfile就是一個很好的例子。 – shabbychef