使用Dockerfile RUN --mount缓存cmake输出

ee7vknir  于 2023-08-03  发布在  Docker
关注(0)|答案(1)|浏览(146)

我正在尝试理解Dockerfile以优化我的构建。
目前我有一个完整的非Docker开发环境。我已经通过apt-get install安装了包和编译器,并且我有一个构建脚本,它可以适当地执行cd build && ninja
我想转换到一个合适的Docker环境。以下是摘录:

FROM ubuntu
WORKDIR /app
RUN apt-get update && \
    apt-get install -y ETC_ETC_ETC
COPY . /app
RUN cd /app
RUN --mount=type=cache,target=./build,sharing=locked \
   mkdir -p build && cd build && cmake .. && make -j4
CMD ["/app/build/bin/exec"]

字符串
我的要求是:我将破解源代码(.)并运行docker build -f ../Dockerfile。我希望保留make的输出,这样修改一个源文件就不会从头触发cmakemakemake足够聪明,如果只有1-2个源文件被修改,它不会触发整个重新编译。
有没有可能转换Dockerfile来实现这个持久构建树?我正在与VOLUME和mount绑定作斗争,但无济于事。
希望像上面一样缓存和重用构建输出。我还将在适当的时候从容器中提取make install文件夹。
编辑:
其思想如下:
1.设置环境、存储库、依赖关系。
1.克马克

  1. make && make install --第一次运行会很长。10分钟
    1.运行并测试代码-单个应用程序
  2. hack on repo code,git commit,etc
    1.后藤3. --后续运行将很快,即三四秒。-
    如果它不是显而易见的,这个想法是快速迭代-破解代码,make && make安装,运行。重启。在经典的Docker环境中,make步骤总是从头开始。不行
xiozqbni

xiozqbni1#

你误解了Docker的概念。
docker build通过执行Dockerfile中的命令创建一个“镜像”。用于设置构建环境。
然后docker run基于镜像创建一个新的容器并启动它。当您实际上想要触发生成时使用此选项。
所以你要问这样一个问题:我必须执行哪些命令才能将新的Ubuntu转换为可以触发构建的环境?这些命令会进入dockerfile。
另一个问题是:我需要运行哪些命令来构建我的软件(即cmakemake)?这些需要进入某种形式的脚本,该脚本由Dockerfile复制到图像中,然后在Dockerfile的CMD语句中提到。

相关问题