什么是更好的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的caching中,我希望减less这个时间。 docker镜像会增加,因为tgz太大,甚至包含的最终磁盘使用量也只有1GB左右。

我的问题是如何将图像大小减less到接近1GB? 这个install_10GB.tgz是由我们自己生成的,如果我想保存一个图层,我应该设置一个本地web服务器来做到这一点? 或者,还有其他的Dockerfile命令可以用来从我的本地磁盘抓取这个文件,而不需要增加额外的层。

把你的文件install_10GB.tgz放在简单的服务器上,然后使用curl或者wget把它运行到RUN命令中,然后你就可以使用它而不需要增加额外的图层。这样,图像的大小就会比较小。

例:

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

您可以使用两个FROM命令的多级构build 。 最终图像将只包含第二个From之后的所有图层。 这样你可以有一个小的图像,而不是必须rm的大文件。 检查链接到文档的更多细节。

这里是一个多级构build的例子:

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

结合其他两个答案,提示是

  1. 从本地Web服务器下载
  2. 使用多个FROM命令和FROM ... AS来清除
  3. 使用COPY --from从最后一个阶段的命令
  4. 使用.dockerignore

这个方法可以通过删除172.17.0.1 IP来改进,但我不知道如何。

.dockerignore忽略大文件发送到dockercaching

 *.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