我正在使用docker编译一个相当慢的C++进程。构建我的软件大约需要3个小时。为了加快速度,我在混合中添加了ccache
。
因此,在构建之后,我正在执行以下操作:docker create --name=ccache LAST_IMAGE
然后使用docker cp
复制/root/.ccache
目录-将其压缩,然后使用ADD
命令在重新构建时将tar重新插入到下一个图像中。
我只是切换到以下方法-因为它似乎占用了驱动器上更少的中间空间:
当我调用docker build
时,我传入一个build参数
77 │ - DOCKER_BUILDKIT=1 docker build --force-rm
78 │ --file devops/Dockerfile.buildAfsim
79 │ --build-arg GIT_COMMIT=${CI_COMMIT_SHA}
80 │ --build-arg PARENT_IMAGE=$DOCKER_REGISTRY$PARENT_IMAGE_NAME
81 │ --build-arg LAST_BUILD_IMAGE=$DOCKER_REGISTRY$AFSIM_BUILD_IMAGE_NAME
82 │ --tag $DOCKER_REGISTRY$AFSIM_BUILD_IMAGE_NAME .
这里的关键是我将图像本身传递了两次:
--build-arg LAST_BUILD_IMAGE=$DOCKER_REGISTRY$AFSIM_BUILD_IMAGE_NAME
--tag $DOCKER_REGISTRY$AFSIM_BUILD_IMAGE_NAME
反过来,这将告诉我的docker构建过程提取最后一个图像-将
cmake
和cache
目录复制到当前docker上下文中在我的docker文件中,我得到了:
ARG LAST_BUILD_IMAGE
FROM ${LAST_BUILD_IMAGE} as last_build
# Pass in the base build image
ARG PARENT_IMAGE
FROM ${PARENT_IMAGE}
# Copy the ccache and cmake files from the previous run in order to speed up build speeds
# This will cause issues - if we dont actualy have a last build saved somewhere but we'll deal
# with that when we get to it.
copy --from=last_build /devel/software/build /devel/software/build
copy --from=last_build /root/.ccache /root/.ccache
有人做过这样的事吗?这确实对我的ci生成时间产生了很大影响-但我想知道是否有更好的方法。到目前为止,这是我想出的最好的。
最佳答案
您可以将缓存目录保存在卷中。将构建容器运行为:
docker run -v ccache:/root/.ccache ...
注意,我们没有绝对路径在左边,而是
ccache
。这将创建一个没有保存在主机系统上任何特定目录中的命名卷。只能按名称访问。挂载
/root/.ccache
卷后,写入ccache
的所有数据将在以后的运行中自动可用。您可以随时运行docker volume rm ccache
清除缓存并强制重新构建。
关于docker - 自反docker镜像构建的健全性检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56599165/