我希望使用 Dockerfile 从源代码构建一个相当大的代码库。源代码是用 C++ 编写的,构建系统是用 Makefile 编写的。目前我的 Dockerfile 如下所示:

FROM ubuntu:16.04

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        vim g++ make && \
    rm -rf /var/lib/apt/lists/*

COPY src /src # `src` folder contains the source code
WORKDIR /src
RUN make && make all

我对这个 Dockerfile 的主要担忧是 - 假设稍后当我修改大型代码库的一小部分并重新执行 docker build 命令时,会发生以下哪些情况?
  • Docker 再次进行复制并找出 make 的构建依赖项。
  • Docker 什么都不做,因为 Dockerfile 没有改变。
  • Docker 从一开始就构建了整个代码库。

  • 如果发生第二个或第三个,有没有比将 make 命令放入 Dockerfile 更好的选择?我应该将它作为 docker run 的一部分执行并将源代码目录挂载到 Docker 容器上吗?

    谢谢。

    最佳答案


    。它将您的源复制到容器中的指定目标

    没有 。即使您不更改 Dockerfile ,Docker 也会重新构建您的代码。这是因为您更改了代码库。如果您没有更改代码库,它可能什么都不做,因为它只能检索构建的最后一层。 (注意命令的顺序可能会改变这里的缓存逻辑)

    默认是 。如果您没有将预编译的工件复制到您的容器中(您不应该这样做),那么它将从头开始重新构建您的代码。

    make 命令放在 Dockerfile 中是更好的选择 在这里。人们使用 Docker 的最重要的原因之一(如果不是最重要的)是拥有 可预测的构建
    笔记
    一种可能的“更好的方法”是使用 multi-stage builds 将“构建器容器”和“保存二进制文件的容器”分开。这也为您提供了较小的“最终”图像,因为您可以从 alpinescratch 构建它们。这样你的“最终”容器就不必包含不必要的库/软件。

    关于Docker 和 Makefile 构建,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54761769/

    10-16 12:33
    查看更多