如何使用缓存快速重建dockerfile?

时间:2014-02-26 03:09:24

标签: caching centos docker

我想优化我的Dockerfile。我希望将缓存文件保存在磁盘中。 但是,当我运行docker build .时,我发现它始终尝试从网络中获取每个文件。

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

有什么建议吗?(在这个例子中,只安装了1 rpm,在实际情况下,我需要安装数百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

第二次,我想构建一个类似的图像

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

我不希望再次从internat获取openssh-server(它很慢)。在我的实际情况中,它不是一个包,它是大约100个包。

3 个答案:

答案 0 :(得分:10)

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

Base Dockerfile,使用docker build -t custom-base或其他内容构建它:

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

答案 1 :(得分:9)

您应该使用缓存代理(f.e Http Replicator,squid-deb-proxy ...)或apt-cacher-ng来为Ubuntu缓存安装包。我想,您可以将此软件安装到主机上。

编辑:

选项1 - 缓存http代理 - 使用修改后的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/

您应该选择不时清除缓存。

选项2 - 缓存透明代理,不修改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!)启动复制器。

设置透明重定向:

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

禁用重定向:

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

此方法是最透明和通用的,您的Dockerfile不需要修改。您应该选择不时清除缓存。

答案 2 :(得分:9)

对以前答案的更新,当前的docker build  接受传递--build-arg等环境变量的http_proxy  不保存在生成​​的图像中。

示例:

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