当前的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命令可以用来从我的本地磁盘中获取此文件,而无需添加额外的图层。
答案 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)
结合其他两个答案,提示是
FROM
命令和FROM ... AS
来明确COPY --from
命令可以通过删除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