如何优化容器内c++项目的构建时间



我有一个以下Docker文件与c++项目安装依赖,复制cpp-project并构建它。

FROM amd64/debian:bullseye-slim as builder
LABEL description="Build container"
# Update and install build dependencies
RUN apt-get update && 
apt-get -y install 
build-essential 
cmake 
libxmlrpc-c++8-dev 
libxmlrpc-c++8v5 
libxmlrpc-core-c3-dev 
libxmlrpc-core-c3 
xmlrpc-api-utils 
curl 
libcurl4-openssl-dev 
libsqlite3-dev 
sqlite3 
libxml2-dev &&  
apt-get clean && 
rm -rf /var/lib/apt/lists/*
# Copy source files
COPY cpp-project/ /usr/local/src/cpp-project/
# Specify the working directory
WORKDIR /usr/local/src/cpp-project/build
# Compile daemon
RUN cmake .. && make
FROM amd64/debian:bullseye-slim as runtime
LABEL description="Run container"
# Update apps on the base image
RUN apt-get update && 
apt-get -y install 
tini 
libxmlrpc-c++8v5 
sqlite3 
libxml2 && 
apt-get clean && 
rm -rf /var/lib/apt/lists/*

RUN mkdir /usr/local/daemon
# Daemon bin
COPY --from=builder /usr/local/src/cpp-project/build/my-daemon /usr/local/daemon/my-daemon
WORKDIR /usr/local/daemon
#ENTRYPOINT ["/sbin/tini", "-v", "--"]
ENTRYPOINT ["/usr/bin/tini", "-v", "--"]
CMD ["./my-daemon"]
EXPOSE 40302

这种构建映像的方式需要时间,因为每次代码更改时它都会复制源文件并运行cmake和make。所有以前构建的库都将在下一个构建中消失,并且cmake/make将不会利用以前的构建,因为它是一个新的docker,并且以前的构建目录不存在。

是否有可能修改或某种卷挂载,以便构建目录持久化,下一个cmake/build利用以前的构建库?我只是想加快我在本地机器上的开发进程。

Modern Dockerfiles允许您指定应该用于缓存目的的持久卷。将RUN cmake .. && make替换为:

RUN --mount=type=cache,target=/usr/local/src/cpp-project/build,sharing=locked 
cmake .. && cmake --build . && cp my-daemon /

并在第二阶段从/my-daemon中抓取my-daemon

sharing=locked参数防止多个并发构建相互干扰。