您应该尝试从第三方服务保存和恢复您的缓存数据: - 像 Amazon S3 这样的在线对象存储 - 简单的 FTP 服务器 - 具有 ssh 的 Internet 可用机器scp
我假设您的缓存数据存储在“~/.ccache”目录中
使用 Docker 多阶段构建
一段时间以来,Docker 支持多阶段构建,您可以尝试使用它通过单个 Dockerfile 实现解决方案:
警告:我没有测试过
# STAGE 1 - YOUR ORIGINAL DOCKER FILE CUSTOMIZED
# CACHE_TAG is provided by Docker cloud
# see https://docs.docker.com/docker-cloud/builds/advanced/
# using ARG in FROM requires min v17.05.0-ce
ARG CACHE_TAG=latest
FROM qgis/qgis3-build-deps:${CACHE_TAG} as builder
MAINTAINER Denis Rouzaud <denis.rouzaud@gmail.com>
ENV CC=/usr/lib/ccache/clang
ENV CXX=/usr/lib/ccache/clang++
ENV QT_SELECT=5
COPY . /usr/src/QGIS
WORKDIR /usr/src/QGIS/build
# restore cache
RUN curl -o ccache.tar.bz2 http://my-object-storage/ccache.tar.bz2
RUN tar -xjvf ccache.tar.bz2
COPY --from=downloader /.ccache ~/.ccache
RUN cmake \
-GNinja \
-DCMAKE_INSTALL_PREFIX=/usr \
-DBINDINGS_GLOBAL_INSTALL=ON \
-DWITH_STAGED_PLUGINS=ON \
-DWITH_GRASS=ON \
-DSUPPRESS_QT_WARNINGS=ON \
-DENABLE_TESTS=OFF \
-DWITH_QSPATIALITE=ON \
-DWITH_QWTPOLAR=OFF \
-DWITH_APIDOC=OFF \
-DWITH_ASTYLE=OFF \
-DWITH_DESKTOP=ON \
-DWITH_BINDINGS=ON \
-DDISABLE_DEPRECATED=ON \
.. \
&& ninja install
# save the current cache online
WORKDIR ~/
RUN tar -cvjSf ccache.tar.bz2 .ccache
RUN curl -T ccache.tar.bz2 -X PUT http://my-object-storage/ccache.tar.bz2
# STAGE 2
FROM alpine:latest
# YOUR CUSTOM LOGIC TO CREATE THE FINAL IMAGE WITH ONLY REQUIRED BINARIES
# USE THE FROM IMAGE YOU NEED, this is only an example
# E.g.:
# COPY --from=builder /usr/src/QGIS/build/YOUR_EXECUTABLE /usr/bin
# ...
在第 2 阶段,您将构建将推送到您的存储库的最终映像。
使用 Docker 云钩子
另一种但不太清楚的方法可能是使用 Docker Cloudpre_build
挂钩文件来下载缓存数据:
#!/bin/bash
echo "=> Downloading build cache data"
curl -o ccache.tar.bz2 http://my-object-storage/ccache.tar.bz2 # e.g. Amazon S3 like service
cd /
tar -xjvf ccache.tar.bz2
显然,您可以在此脚本中使用专用 docker 映像运行 curl 或 tar 将本地目录挂载为卷。
然后,.ccache
在构建过程中将提取的文件夹复制到容器中,在调用COPY
之前使用命令:cmake
WORKDIR /usr/src/QGIS/build
COPY /.ccache ~/.ccache
RUN cmake ...
为了做到这一点,您应该找到一种在构建后上传缓存数据的方法,您可以使用post_build
挂钩文件轻松完成此操作:
#!/bin/bash
echo "=> Uploading build cache data"
tar -cvjSf ccache.tar.bz2 ~/.ccache
curl -T ccache.tar.bz2 -X PUT http://my-object-storage/ccache.tar.bz2
但是您的编译数据不能从外部获得,因为它们存在于容器内。cmake
因此,您应该在 main中的命令之后上传缓存Dockerfile
:
RUN cmake...
&& tar ...
&& curl ...
&& ninja ...
&& rm ...
如果curl
或 tar 不可用,只需使用包管理器将它们添加到您的容器中(qgis/qgis3-build-deps
基于 Ubuntu 16.04,因此它们应该可用)。