我正在尝试理解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
的输出,这样修改一个源文件就不会从头触发cmake
或make
。make
足够聪明,如果只有1-2个源文件被修改,它不会触发整个重新编译。
有没有可能转换Dockerfile来实现这个持久构建树?我正在与VOLUME和mount绑定作斗争,但无济于事。
希望像上面一样缓存和重用构建输出。我还将在适当的时候从容器中提取make install
文件夹。
编辑:
其思想如下:
1.设置环境、存储库、依赖关系。
1.克马克
- make && make install --第一次运行会很长。10分钟
1.运行并测试代码-单个应用程序 - hack on repo code,git commit,etc
1.后藤3. --后续运行将很快,即三四秒。-
如果它不是显而易见的,这个想法是快速迭代-破解代码,make && make安装,运行。重启。在经典的Docker环境中,make步骤总是从头开始。不行
1条答案
按热度按时间xiozqbni1#
你误解了Docker的概念。
docker build
通过执行Dockerfile中的命令创建一个“镜像”。用于设置构建环境。然后
docker run
基于镜像创建一个新的容器并启动它。当您实际上想要触发生成时使用此选项。所以你要问这样一个问题:我必须执行哪些命令才能将新的Ubuntu转换为可以触发构建的环境?这些命令会进入dockerfile。
另一个问题是:我需要运行哪些命令来构建我的软件(即
cmake
和make
)?这些需要进入某种形式的脚本,该脚本由Dockerfile复制到图像中,然后在Dockerfile的CMD语句中提到。