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

时间:2017-09-25 09:16:45

标签: docker 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的缓存中,我希望减少这段时间。 docker镜像会增加,因为tgz太大甚至包含的最终磁盘使用量大约为1GB。

我的问题是如何将图像尺寸减小到接近1GB? 这个install_10GB.tgz是我们自己生成的,如果我想保存一个图层,我应该设置一个本地Web服务器吗?或者,还有其他Dockerfile命令可以用来从我的本地磁盘中获取此文件,而无需添加额外的图层。

3 个答案:

答案 0 :(得分: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/*

答案 1 :(得分:0)

您可以使用multistage build和两个FROM命令。最终图像仅包含第二个From之后的所有图层。这样你就可以拥有一个小图像,而不必使用大文件。有关详细信息,请查看文档链接。

这是一个多阶段构建的例子:

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

答案 2 :(得分:0)

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

  1. 从本地网络服务器下载
  2. 使用多个FROM命令和FROM ... AS来明确
  3. 在最后阶段使用COPY --from命令
  4. 使用.dockerignore
  5. 可以通过删除172.17.0.1 IP来改进此方法,但我不知道如何。

    .dockerignore忽略发送到docker cache的大文件

    *.tgz
    

    build.sh来设置本地Web服务器

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

    Dockerfile与' extract'作为第一阶段名称

    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