Docker使用缓存编译 Qt
Docker 在使用层进行缓存方面做得很好。每个命令(例如,RUN、ADD 等)都会生成一个层,Docker 会在未来的构建中重用该层,除非发生某些变化。与往常一样,这个过程也有例外,但一般来说这是正确的。另一种类型的缓存是针对容器内的特定操作(例如编译源代码)进行缓存。
在 Screenly,我们在 Docker 容器内创建了一个 Qt 构建环境。我们创建此 Qt 构建是为了确保构建过程可重现并易于在开发人员之间共享。由于 Qt 编译过程需要很长时间,我们利用ccache来加速我们的 Qt 编译。实施 ccache 需要从 Docker 环境外部卷安装文件夹。
如果您是该项目的唯一开发人员,则上述步骤很有效。如果您希望能够在团队中共享缓存,会发生什么情况?
有几种方法可以在 Docker 中实现这种缓存方式。
建立共享缓存的最简单方法是按照我们在上一篇文章中所做的操作。我们使用磁盘缓存以及一些简洁的功能来加速 BuildKit 中的缓存。然后我们压缩缓存文件并将它们分发给团队成员。这个过程不是很优雅,但它完成了工作。
如果我们想进一步自动化该过程,我们可以将检索缓存作为构建过程的一部分。这方面的一个例子可能是这样的:
RUN curl -o /tmp/build-cache.tgz https://some-domain.com/build-cache.tgz && \
tar xfz /tmp/build-cache.tgz -C /tmp && \
rm /tmp/build-cache.tgz
上面的过程很简洁,但这确实意味着有人需要定期上传构建缓存以保持缓存文件最新。此外,您需要在某个地方存储文件(例如 S3)。
如果我们可以避免手动任务并使用原生 Docker 技术来做同样的事情,那就太好了,对吧?事实证明,我们可以使用 Docker 来改进流程。我们只需要发挥我们的想象力。
正如我们在上一篇文章中展示的那样,我们可以使用多阶段构建在不同的 docker 镜像之间复制数据。如果我们将缓存移动到专用的 Docker 映像会怎样?然后我们可以将这个镜像推送到 Docker Hub 并将其拉入构建过程。
这个过程很简单。首先在 Docker Hub 中创建两个不同的图像。打电话给他们screenly/build-cache和screenly/build-env。在上一篇文章的基础上,我们使用这个Dockerfile作为基础screenly/build-env。
在 Dockerfile 中,我们将环境变量设置CCACHE_DIR为/src/ccache. 这一步告诉 ccache 缓存驻留在/src/ccache. 在上一篇文章中,该步骤只是将卷装入系统。但是,在这种情况下,我们想要更改此步骤,以便缓存位于 之外/src,因为这用于批量安装代码库,例如/usr/ccache.
我们现在可以启动容器:
$ docker run --rm -t \
-v ~/tmp/qt-src:/src \
-v ~/tmp/qt-build:/build \
-v ~/tmp/ccache:/usr/ccache \
screenly-build-env
完成编译后,您现在可以构建并推送我们的缓存映像。最终的 Dockerfile 将如下所示:
FROM scratch
COPY ccache /ccache
要构建此映像,请使用以下代码:
$ cd ~/tmp
$ docker build \
-f /path/to/Dockerfile \
-t screenly/build-cache
$ docker push screenly/build-cache
最后,您现在可以将这一层包含在screenly/build-env. 添加行:
COPY --from=screenly/build-cache /ccache /usr/ccache
下次重建screenly/build-env时,Docker 会自动拉下缓存。此外,您只需在刷新缓存时添加卷挂载。
您可能也感兴趣:
官方微博/微信

每日头条、业界资讯、热点资讯、八卦爆料,全天跟踪微博播报。各种爆料、内幕、花边、资讯一网打尽。百万互联网粉丝互动参与,TechWeb官方微博期待您的关注。

想在手机上看科技资讯和科技八卦吗?
想第一时间看独家爆料和深度报道吗?
请关注TechWeb官方微信公众帐号:
1.用手机扫左侧二维码;
2.在添加朋友里,搜索关注TechWeb。
为您推荐
外媒称国内电动汽车电池制造商已在扩展韩国市场
丰田将向北卡罗来纳州新电池厂再投资21亿美元 投资总额达59亿美元
苹果App Store去年创收1.1万亿美元 超九成归于开发者和企业
外媒:苹果MR头显设计独特复杂 给生产带来前所未有的挑战
iPhone 15 Pro Max核心参数曝光:首发3nm A17芯片+8GB内存
机构数据显示特斯拉Model Y一季度在国内销售9.44万辆
马斯克深夜到访特斯拉上海超级工厂 新款Model 3或将量产
阿里影业2023财年经调整EBITA盈利2.95亿元 同比增加106%
周鸿祎:多模态大模型+物联网 是下一个风口
更多
- 再创历史新高 比亚迪5月新能源车销量24.02万辆
- B站第一季度净亏损同比大幅收窄72% 日活用户达9370万
- 理想5月交付28000辆新车,首次实现百亿级月收入
- 魔搭社区举办AI编程马拉松大赛,获胜队伍有望共享千万美金风投资金池
- 「京东京造」携手「什么值得买」打造618好物清单
- 专访亲宝宝冯培华:探索母婴领域“类ChatGPT”的大模型应用产品
- VectorPath加速卡已通过PCI-SIG的PCIe Gen5认证
- 哪吒汽车5月全系交付13029辆 同比增长18%,哪吒GT交付1716辆
- 360孙浩:进军SMB市场,360安防产品有独特优势
- 再创品牌新高 广汽埃安5月销量45003辆,同比增长114%
更多
- 起亚计划2030年在欧洲销售超过50万辆电动汽车 占年度销量近三分之一
- LG新能源和现代汽车集团将斥资43亿美元在美合建一家电池厂
- 外媒称国内电动汽车电池制造商已在扩展韩国市场
- 丰田将向北卡罗来纳州新电池厂再投资21亿美元 投资总额达59亿美元
- 业内人士透露英伟达A100、H100等供不应求 但部分厂商将优先供应
- 传言称VR节奏游戏《节奏光剑》或将登陆苹果首款MR头显
- 苹果App Store去年创收1.1万亿美元 超九成归于开发者和企业
- 韩国半导体出口额同比仍在下滑 5月份降至73.7亿美元
- 外媒:苹果MR头显设计独特复杂 给生产带来前所未有的挑战
- 机构数据显示特斯拉Model Y一季度在国内销售9.44万辆