如何通过使用caching快速重builddockerfile?

我想优化我的Dockerfile。 我希望将caching文件保存在磁盘中。 但是,我发现当我运行docker build . 它总是试图从networking上获取每个文件。

我希望在构build期间共享我的caching目录(例如/ var / cache / yum / x86_64 / 6)。 但是,它只适用于docker run -v ...

任何build议?(在这个例子中,只有1转安装,在实际情况下,我需要安装数百rpms)

我的草稿Dockerfile

 FROM centos:6.4 RUN yum update -y RUN yum install -y openssh-server RUN sed -i -e 's:keepcache=0:keepcache=1:' /etc/yum.conf VOLUME ["/var/cache/yum/x86_64/6"] EXPOSE 22 

第二次,我想要build立一个类似的图像

 FROM centos:6.4 RUN yum update -y RUN yum install -y openssh-server vim 

我不想再从internat获取openssh-server(这很慢)。 在我的真实情况下,它不是一个包,它是大约100包。

更新到以前的答案,当前的docker构build接受--build-arg传递像http_proxy这样的环境variables,而不是保存在结果图像。

例:

 # get squid docker run --name squid -d --restart=always \ --publish 3128:3128 \ --volume /var/spool/squid3 \ sameersbn/squid:3.3.8-11 # optionally in another terminal run tail on logs docker exec -it squid tail -f /var/log/squid3/access.log # get squid ip to use in docker build SQUID_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' squid) # build your instance docker build --build-arg http_proxy=http://$SQUID_IP:3128 . 

您应该使用caching代理(fe Http Replicator ,squid-deb-proxy …)或apt-cacher-ng来caching安装包。 我想,你可以把这个软件安装到主机上。

编辑:

选项1 – cachinghttp代理 – 修改Dockerfile的更简单的方法:

 > cd ~/your-project > git clone https://github.com/gertjanvanzwieten/replicator.git > mkdir cache > replicator/http-replicator -r ./cache -p 8080 --daemon ./cache/replicator.log --static 

添加到您的Dockerfile(在第一个RUN行之前):

 ENV http_proxy http://172.17.42.1:8080/ 

您应该随时清除caching。

选项2 – caching透明代理,不修改Dockerfile:

 > cd ~/your-project > curl -o r.zip https://codeload.github.com/zahradil/replicator/zip/transparent-requests > unzip r.zip > rm r.zip > mv replicator-transparent-requests replicator > mkdir cache > replicator/http-replicator -r ./cache -p 8080 --daemon ./cache/replicator.log --static 

您需要以某个用户(非root!)启动复制器。

设置透明redirect:

 > iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner <replicator-user> --dport 80 -j REDIRECT --to-port 8080 

禁用redirect:

 > iptables -t nat -D OUTPUT -p tcp -m owner ! --uid-owner <replicator-user> --dport 80 -j REDIRECT --to-port 8080 

这个方法是最透明和最通用的,你的Dockerfile不需要修改。 您应该随时清除caching。

只需使用中间/基本图像:

基础Dockerfile,使用docker docker build -t custom-base构build它:

 FROM centos:6.4 RUN yum update -y RUN yum install -y openssh-server vim RUN sed -i -e 's:keepcache=0:keepcache=1:' /etc/yum.conf 

应用程序Dockerfile:

 FROM custom-base VOLUME ["/var/cache/yum/x86_64/6"] EXPOSE 22