docker build - 避免添加仅在构建时需要的文件
docker build - Avoid ADDing files only needed at build time
我正在尝试构建一个 docker 图像来避免不必要的体积,我 运行 遇到了一个我认为应该很常见的问题,但到目前为止我还没有找到直接的解决方案。 (我在 ubuntu 18.04 系统上构建 docker,并从 FROM ubuntu
层开始。)
特别是,我有一个非常大的 .deb 文件(超过 3G),我需要在映像中安装它。 COPY
或 ADD
然后 RUN dpkg -i
很容易,但这会导致我不需要的几 GB 的 space 重复。当然,只是删除文件并不会减小图像大小。
我希望能够挂载一个卷来访问 .deb
文件,而不是 COPY
它,这在 运行 一个容器时很容易做到,但在建造一个时显然不可能做到?
到目前为止我想出的是构建 docker 到我要 ADD
文件的程度,然后 运行 它安装了一个卷所以我可以从容器访问它而无需 COPY
ing 它,然后我 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 / /
).
我正在尝试构建一个 docker 图像来避免不必要的体积,我 运行 遇到了一个我认为应该很常见的问题,但到目前为止我还没有找到直接的解决方案。 (我在 ubuntu 18.04 系统上构建 docker,并从 FROM ubuntu
层开始。)
特别是,我有一个非常大的 .deb 文件(超过 3G),我需要在映像中安装它。 COPY
或 ADD
然后 RUN dpkg -i
很容易,但这会导致我不需要的几 GB 的 space 重复。当然,只是删除文件并不会减小图像大小。
我希望能够挂载一个卷来访问 .deb
文件,而不是 COPY
它,这在 运行 一个容器时很容易做到,但在建造一个时显然不可能做到?
到目前为止我想出的是构建 docker 到我要 ADD
文件的程度,然后 运行 它安装了一个卷所以我可以从容器访问它而无需 COPY
ing 它,然后我 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 / /
).