我希望使用 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
命令时,会发生以下哪些情况?make
的构建依赖项。 Dockerfile
没有改变。 如果发生第二个或第三个,有没有比将
make
命令放入 Dockerfile
更好的选择?我应该将它作为 docker run
的一部分执行并将源代码目录挂载到 Docker 容器上吗?谢谢。
最佳答案
是 。它将您的源复制到容器中的指定目标
没有 。即使您不更改 Dockerfile
,Docker 也会重新构建您的代码。这是因为您更改了代码库。如果您没有更改代码库,它可能什么都不做,因为它只能检索构建的最后一层。 (注意命令的顺序可能会改变这里的缓存逻辑)
默认是 。如果您没有将预编译的工件复制到您的容器中(您不应该这样做),那么它将从头开始重新构建您的代码。
将 make
命令放在 Dockerfile
中是更好的选择 在这里。人们使用 Docker 的最重要的原因之一(如果不是最重要的)是拥有 可预测的构建
笔记
一种可能的“更好的方法”是使用 multi-stage builds 将“构建器容器”和“保存二进制文件的容器”分开。这也为您提供了较小的“最终”图像,因为您可以从 alpine 或 scratch 构建它们。这样你的“最终”容器就不必包含不必要的库/软件。
关于Docker 和 Makefile 构建,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54761769/