我正在使用docker编译一个相当慢的C ++进程。构建我的软件大约需要3个小时。为了加快处理速度,我将ccache
添加到了组合中。
因此,在构建之后,我正在执行以下操作:
docker create --name=ccache LAST_IMAGE
然后使用docker cp
复制出/root/.ccache
目录-将其焦油,然后使用ADD
命令将tar重新插入到下一个映像中。
我刚刚切换到以下方法-因为它似乎占用了驱动器上更少的中间空间:
当我调用docker 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生成时间有很大的影响-但我想知道是否有更好的方法。到目前为止,这是我想出的最好的。
答案 0 :(得分:1)
您可以将缓存目录保存在卷中。将构建容器运行为:
docker run -v ccache:/root/.ccache ...
请注意,除了左侧没有绝对路径外,我们只有ccache
。这将创建一个没有保存在主机系统上任何特定目录中的命名卷。只能按名称访问。
在装入/root/.ccache
卷后,任何写入ccache
的数据将在以后的运行中自动提供。您随时可以运行docker volume rm ccache
清除缓存并强制重新构建。