注意:由于新的Docker Hub似乎支持缓存,因此我的问题的前提似乎不再有效.我没有亲自测试过这个.请参阅下面的新答案.
Docker Hub的Automated Build Repositories似乎不会缓存图像.在构建时,它会删除所有中间容器.这是打算工作的方式还是我做错了什么?如果没有为每一个小变化重建一切,那将是非常好的.我认为这应该是docker的最佳优势之一,并且它们的构建器不使用它似乎很奇怪.那为什么不缓存图像呢?
更新:我已经开始使用Codeship来构建我的应用程序,然后在我的DigitalOcean服务器上运行远程命令来复制构建的文件并运行docker build命令.我还不确定为什么Docker Hub不会缓存.
小智 25
免责声明:我是Quay.io的首席软件工程师,这是一个私有的Docker容器注册表,所以这是一个有根据的猜测,基于我们在自己的构建系统实现中遇到的同样问题.
鉴于我对Dockerfile构建系统的经验,我怀疑Docker Hub不支持缓存,因为Docker Engine中实现了缓存的方式.Docker构建的缓存通过将要运行的命令与内存中找到的现有层进行比较来进行操作.
例如,如果Dockerfile具有以下形式:
FROM somebaseimage
RUN somecommand
ADD somefile somefile
Run Code Online (Sandbox Code Playgroud)
然后Docker构建代码将:
somebaseimage存在图像匹配RUN somecommand父级为上一个图像的命令检查是否存在本地映像ADD somefile somefile+ 内容的散列somefile(以确保在somefile更改时无效),其父级是上一个图像如果上述任何步骤匹配,则在Dockerfile构建过程中将跳过该命令,而使用缓存的图像本身.但是,此过程的一个关键问题是它需要缓存的图像出现在构建计算机上,以便查找和验证匹配项.拥有所有的每个人在构建节点的图像将是非常低效的,使之成为一个很难解决的问题.
在Quay.io,我们通过创建Docker缓存代码的变体解决了缓存问题,该代码可以预先计算这些命令/哈希值,然后向我们的注册表询问缓存层,只有在我们找到最有效的缓存后才将它们下载到机器上组.这需要我们的注册表代码中的重要数据模型更改.
如果您想了解更多信息,我们在本次演讲中提供了技术概述:https://youtu.be/anfmeB_JzB0?list = PLlh6TqkU8kg8Ld0Zu1aRWATiqBkxseZ9g
| 归档时间: |
|
| 查看次数: |
2105 次 |
| 最近记录: |