2017-09-25 52 views
0

當前Dockerfile如下:對於非常大的安裝文件,更好的Dockerfile命令是什麼?

FROM centos 
ADD install_10GB.tgz /opt/tmp 
RUN /opt/tmp/setup.bin && rm -rf /opt/tmp/* 

當我運行docker build -t my_image .,它需要太多的時間給TGZ文件發送到碼頭工人的緩存,我想縮短這一時間。 docker映像將會增加,因爲tgz太大,即使是包含的最終磁盤使用量也只有大約1GB。

我的問題是如何將圖像大小降低到接近1GB? 這個install_10GB.tgz是我自己生成的,如果我想保存一個圖層,我應該設置一個本地web服務器來做到這一點嗎?或者,還有其他的Dockerfile命令可以用來從我的本地磁盤抓取這個文件而不需要增加額外的層。

+0

較新的docker版本有一個'--squash'選項用於build命令。這有助於圖像大小。但構建上下文的傳輸時間保持不變。 – Henry

+2

你可以檢索你的tgz從網絡的某個地方的圖像?一個工件庫,代碼回購等?使用捲曲可以讓你保存圖層。 – BMitch

+0

如果您的'tgz'沒有使用壓縮,那麼您可以使用'docker build --compress -t my_image .'但是仍然會將文件發送到上下文。所以,如果你想節省時間,你應該使用@BMitch提到的方法,即在構建過程中啓動一個簡單的服務器,該服務器可以提供該文件並使用'curl'或'wget'獲取文件。 –

回答

0

結合其他兩個答案,提示是從本地Web服務器

  1. 下載
  2. 使用多個FROM命令和FROM ... AS使它清除
  3. 使用COPY --from命令在最後一個階段
  4. 使用.dockerignore

這種方法可以通過刪除172.17.0.1 IP來改進,但我不知道如何。

.dockerignore爲忽略的大文件發送到泊塢窗緩存

*.tgz 

build.sh設置本地Web服務器

python2 -m SimpleHTTPServer 8888 # simple web server 
docker build -t my_image . 
pkill python2 # kill the simple web server 

Dockerfile與 '提取物' 作爲第一個藝名

FROM centos AS extract 
RUN cd /opt/tmp && curl http://172.17.0.1:8888/install_10GB.tgz | tar -xzf - 
RUN /opt/tmp/setup.bin 
# assume the result files put on /usr/local/mypackage 

FROM centos 
COPY --from=extract /usr/local/mypackage /usr/local/mypackage 
0

將您的文件install_10GB.tgz存放在簡單的服務器中,並使用curl或wget將其置於RUN命令中,然後您可以在不添加額外圖層的情況下使用它。這樣,與較早的圖像相比,圖像大小會減少。

例子:

FROM centos 
RUN cd /opt/tmp && curl -XGET 'server/install_10GB.tgz' && setup.bin && rm -rf /opt/tmp/* 
+0

爲什麼?不捲曲也創建一個圖層? – herm

+0

僅在RUN命令中,使用curl命令下載文件。由於它是臨時文件,一旦它達到其目的,它可以在同一個RUN命令中刪除。編輯同樣的答案。 –

0

你可以使用帶有兩個multistage build FROM指令。最終圖像僅包含第二個From後的所有圖層。這樣你可以有一個小的圖像,而不需要rm大文件。查看文檔鏈接以獲取更多詳細信息。

這裏多級構建的例子:

FROM golang:1.7.3 
WORKDIR /go/src/github.com/alexellis/href-counter/ 
RUN go get -d -v golang.org/x/net/html 
COPY app.go . 
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . 

FROM alpine:latest 
RUN apk --no-cache add ca-certificates 
WORKDIR /root/ 
COPY --from=0 /go/src/github.com/alexellis/href-counter/app . 
CMD ["./app"] 
+0

感謝您的鏈接,爲了改進您的答案,您能否直接展示什麼是適當的樣本Docerfile,以保持它在stackoverflow而不僅僅是一個鏈接? –

+0

我添加了一個例子。儘管更多細節應該使用谷歌搜索或我的鏈接:) – herm

相關問題