首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用缓存快速重建dockerfile?

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

Stack Overflow用户
提问于 2014-02-26 11:09:24
回答 3查看 9.1K关注 0票数 11

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

我希望在构建期间共享我的缓存目录(例如:/var/cache/yum/x86_64/6)。但是,它只能在docker run -v ...上运行。

有什么建议吗?(在这个例子中,只安装了1 rpm,在实际情况下,我需要安装数百rpm)

我的Dockerfile草稿

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
FROM centos:6.4
RUN yum update -y
RUN yum install -y openssh-server vim

我不想再从internat获取openssh-server (它很慢)。在我的真实案例中,它不是一个包,而是大约100个包。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-26 05:22:13

作为对以前答案的更新,当前的docker build接受传递环境变量(如http_proxy )的--build-arg,而不将其保存在结果图像中。

示例:

代码语言:javascript
运行
复制
# 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 .
票数 12
EN

Stack Overflow用户

发布于 2014-02-28 22:26:44

只需使用中间/基础镜像:

基础Dockerfile文件,使用docker build -t custom-base或其他工具构建它:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
FROM custom-base
VOLUME ["/var/cache/yum/x86_64/6"] 
EXPOSE 22
票数 11
EN

Stack Overflow用户

发布于 2014-02-28 16:31:20

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

编辑:

选项1-缓存http代理-使用修改后的Dockerfile文件更简单的方法:

代码语言:javascript
运行
复制
> 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 (在第一个运行行之前):

代码语言:javascript
运行
复制
ENV http_proxy http://172.17.42.1:8080/

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

选项2-缓存透明代理,不修改Dockerfile:

代码语言:javascript
运行
复制
> 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用户!)的身份启动复制器。

设置透明重定向:

代码语言:javascript
运行
复制
> iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner <replicator-user> --dport 80 -j REDIRECT --to-port 8080

禁用重定向:

代码语言:javascript
运行
复制
> iptables -t nat -D OUTPUT -p tcp -m owner ! --uid-owner <replicator-user> --dport 80 -j REDIRECT --to-port 8080

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22030931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档