我有一个以下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
参数防止多个并发构建相互干扰。