对于非常大的安装文件,更好的Dockerfile命令是什么?

问题描述:

当前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'获取文件。 –

结合其他两个答案,提示是从本地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 

将您的文件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命令中删除。编辑同样的答案。 –

你可以使用带有两个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,以保持它在*而不仅仅是一个链接? –

+0

我添加了一个例子。尽管更多细节应该使用谷歌搜索或我的链接:) – herm