docker build - 避免添加仅在构建时需要的文件

docker build - Avoid ADDing files only needed at build time

我正在尝试构建一个 docker 图像来避免不必要的体积,我 运行 遇到了一个我认为应该很常见的问题,但到目前为止我还没有找到直接的解决方案。 (我在 ubuntu 18.04 系统上构建 docker,并从 FROM ubuntu 层开始。)

特别是,我有一个非常大的 .deb 文件(超过 3G),我需要在映像中安装它。 COPYADD 然后 RUN dpkg -i 很容易,但这会导致我不需要的几 GB 的 space 重复。当然,只是删除文件并不会减小图像大小。

我希望能够挂载一个卷来访问 .deb 文件,而不是 COPY 它,这在 运行 一个容器时很容易做到,但在建造一个时显然不可能做到?

到目前为止我想出的是构建 docker 到我要 ADD 文件的程度,然后 运行 它安装了一个卷所以我可以从容器访问它而无需 COPYing 它,然后我 dpkg -i 它,然后我执行 docker 提交以从该容器创建图像。果然,我最终得到的图像比我第一次尝试的小了 3GB 以上,但这似乎是一种 hack,并且使构建脚本变得更加复杂。

我想一定有更合适的方法来实现这一点,但到目前为止我的搜索还没有找到明显的答案。我错过了什么吗?

依赖 docker commit 确实是一种 hack :) 因此,某些参考文献(例如 this blog article.

提到它的使用是不可取的

对于您提到的那种用例,我只看到一种可能的方法(复制一次性 .deb 包,安装它并立即从映像层中删除二进制文件):

您可以使构建图像的 docker 引擎远程可用,您想要安装的 .deb,并替换 COPY + RUN指令只有一个,例如,依赖 curl:

RUN curl -OL https://example.com/foo.deb && dpkg -i foo.deb && rm -f foo.deb

如果curl还没有安装,你可以运行预先使用通常的APT命令:

RUN apt-get update -y -q \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y -q --no-install-recommends \
    ca-certificates \
    curl \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

也许还有另一种可能的解决方案(但我不认为 multi-staged builds Docker 功能在这里会有一些帮助,因为这样做会丢失所有权限,例如 COPY --from=build / /).