首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Docker云自动构建中使用ccache

在Docker云自动构建中使用ccache
EN

Stack Overflow用户
提问于 2017-08-16 14:04:48
回答 1查看 1.4K关注 0票数 3

我正在使用Docker上的自动构建来编译一个C++应用程序并在图像中提供它。编译相当长(范围2-3小时),在github上提交很频繁(每天10到30次)。

是否有一种方法可以保留建筑物缓存(使用ccache)?

据我所知,由于源代码的更改,产生ccache的编译层不会被使用,所以停靠缓存是无用的。或者我们可以调整一些数据返回到第一层吗?

还有其他解决办法吗?把它推到什么地方?

以下是Dockerfile:

代码语言:javascript
复制
# 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}
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

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 \
 && rm -rf /usr/src/QGIS

WORKDIR /
EN

回答 1

Stack Overflow用户

发布于 2017-09-12 15:04:25

您应该尝试从第三方服务中保存和恢复缓存数据:-像Amazon这样的在线对象存储--一个简单的S3服务器--一台因特网上可用的机器,可以使用ssh来生成scp

我假设缓存数据存储在‘~/..ccache’目录中

使用Docker多级构建

从一段时间以来,Docker支持多阶段建造,您可以尝试使用它来使用单个Dockerfile实现解决方案:

警告:我还没有测试过

代码语言:javascript
复制
# 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
# ...

在第二阶段中,您将构建将被推送到存储库中的最终映像。

使用Docker云钩子

另一种但不太明确的方法可能是使用Docker pre_build钩子文件下载缓存数据:

代码语言:javascript
复制
#!/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

显然,您可以使用专用坞映像来运行curl或tar,在此脚本中将本地目录挂载为卷。

然后,在构建过程中在容器中复制.ccache解压文件夹,在cmake调用之前使用COPY命令:

代码语言:javascript
复制
WORKDIR /usr/src/QGIS/build

COPY /.ccache ~/.ccache    

RUN cmake ...

为了做到这一点,您应该找到一种在构建之后上传缓存数据的方法,您可以使用post_build钩子文件轻松地做到这一点:

代码语言:javascript
复制
#!/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命令之后上传缓存。

代码语言:javascript
复制
RUN cmake...
  && tar ...
  && curl ...
  && ninja ...
  && rm ...

如果curl或tar不可用,只需使用包管理器将它们添加到容器中(qgis/qgis3-build-deps基于Ubuntu16.04,因此它们应该可用)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45715746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档