使用先前从仓库中构建的缓存构建Docker容器

9

我正在配置一个竹子构建计划来构建 Docker 镜像,使用 AWS ECS 作为注册表。构建计划大致如下;

  • pull the latest tag

    docker pull xxx.dkr.ecr.eu-west-1.amazonaws.com/myimage:latest
    
  • build image with latest tag

    docker build -t myimage:latest .
    
  • tag the image (necessary for ECS)

    docker tag -f myimage:latest xxx.dkr.ecr.eu-west-1.amazonaws.com/myimage:latest
    
  • Push the image to the registry

    docker push xx.dkr.ecr.eu-west-1.amazonaws.com/myimage:latest
    
因为构建任务每次运行都在不同和新鲜的构建引擎/服务器上,所以它没有本地缓存。
当我没有改变Dockerfile并再次执行它(在另一个服务器上),我期望Docker会使用本地缓存(来自docker pull)并且不会再次执行每一行。但是它每次都尝试构建镜像。我也期望当我在文件底部改变某些内容时,它会使用缓存并只执行最新的一行,但我不确定这一点。
我是否理解有误或者有什么其他看法呢?

你能分享一下“每次尝试构建镜像”的输出是什么样子吗?你仍然会看到每个层被“构建”,但它会说正在使用缓存。 - danehammer
1
-2017 08:38:16 步骤8: 运行 add-apt-repository ppa:maxmind/ppa -y -2017 08:38:17 ---> 在 5806bde2c3d3 中运行 -2017 08:38:17 gpg:创建密钥环 /tmp/tmp5o6q7_ge/secring.gpg' -2017 08:38:17 gpg:创建密钥环 /tmp/tmp5o6q7_ge/pubring.gpg' -2017 08:38:17 gpg:从 hkp 服务器 keyserver.ubuntu.com 请求密钥 DE742AFA -2017 08:38:17 gpg:/tmp/tmp5o6q7_ge/trustdb.gpg:已创建信任数据库 -2017 08:38:17 gpg:导入公钥“Launchpad PPA for MaxMind” 的公钥 DE742AFA - code_ada
只是一个例子。就像我说的那样,它不使用之前的层。 - code_ada
你可以尝试运行 docker build -t myimage:latest --cache-from xxx.dkr.ecr.eu-west-1.amazonaws.com/myimage:latest .,看看是否有帮助。 - Tarun Lalwani
仍然是同一个 Step 2/37 : RUN apt-get update ---> Running in 75f813c63132 获取:1 http://security.ubuntu.com trusty-security InRelease [65.9 kB] - code_ada
显示剩余2条评论
1个回答

4

您是否考虑使用Squid 代理

编辑:如果您不想访问上面的官方网站,这里是 Squid 代理(基于 Debian)的快速设置指南。

apt-get install squid-deb-proxy

然后更改Squid配置,通过打开来创建更大的空间

/etc/squid/squid.conf

#cache_dir ufs /var/spool/squid 替换为 cache_dir ufs /var/spool/squid 10000 16 256,这样就有了 10,000 MB 的缓存空间。

然后在 Dockerfile 中指定代理地址,以下是一个带有 Squid 代理的 Dockerfile 示例。

适用于 yum 和 apt-get 的发行版:

适用于 apt-get 的发行版

`FROM debian
RUN apt-get update -y && apt-get install net-tools
RUN echo "Acquire::http::Proxy \"http://$( \
route -n | awk '/^0.0.0.0/ {print $2}' \
):8000\";" \ > /etc/apt/apt.conf.d/30proxy
RUN echo "Acquire::http::Proxy::ppa.launchpad.net DIRECT;" >> \
/etc/apt/apt.conf.d/30proxy
CMD ["/bin/bash"]`

基于yum的发行版
`FROM centos:centos7
RUN yum update -y && yum install -y net-tools
RUN echo "proxy=http://$(route -n | \
awk '/^0.0.0.0/ {print $2}'):3128" >> /etc/yum.conf
RUN sed -i 's/^mirrorlist/#mirrorlist/' \
/etc/yum.repos.d/CentOS-Base.repo
RUN sed -i 's/^#baseurl/baseurl/' \
/etc/yum.repos.d/CentOS-Base.repo
RUN rm -f /etc/yum/pluginconf.d/fastestmirror.conf
RUN yum update -y
CMD ["/bin/bash"]`

假设您在AWS注册表中安装了Squid代理,只有第一次构建才会从互联网获取数据,其余的(另一个服务器)构建应该来自Squid代理缓存。
这种技术基于书籍《Docker实践》中的技术57,标题为“设置软件包缓存以加快构建”。
我认为在没有任何第三方软件的情况下,Docker中没有缓存功能。也许有,我只是不知道而已。如果我错了,请纠正我。

1
问题不是关于缓存apt软件包,而是关于镜像层。 - code_ada
好的,那只是我的一个小例子,你也可以在图像层上使用Squid缓存。这里有一个docker缓存代理的例子。 - Fendi jatmiko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接