对于非常大的安装文件,更好的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命令可以用来从我的本地磁盘抓取这个文件而不需要增加额外的层。
结合其他两个答案,提示是从本地Web服务器
- 下载
- 使用多个
FROM
命令和FROM ... AS
使它清除 - 使用
COPY --from
命令在最后一个阶段 - 使用.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/*
为什么?不卷曲也创建一个图层? – herm
仅在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"]
感谢您的链接,为了改进您的答案,您能否直接展示什么是适当的样本Docerfile,以保持它在*而不仅仅是一个链接? –
我添加了一个例子。尽管更多细节应该使用谷歌搜索或我的链接:) – herm
较新的docker版本有一个'--squash'选项用于build命令。这有助于图像大小。但构建上下文的传输时间保持不变。 – Henry
你可以检索你的tgz从网络的某个地方的图像?一个工件库,代码回购等?使用卷曲可以让你保存图层。 – BMitch
如果您的'tgz'没有使用压缩,那么您可以使用'docker build --compress -t my_image .'但是仍然会将文件发送到上下文。所以,如果你想节省时间,你应该使用@BMitch提到的方法,即在构建过程中启动一个简单的服务器,该服务器可以提供该文件并使用'curl'或'wget'获取文件。 –