我正在尝试构建一个docker镜像以避免不必要的体积,并且遇到了我认为应该很常见的问题,但是到目前为止,我还没有找到一个简单的解决方案。 (我正在ubuntu 18.04系统上构建docker,并从ConfigureServices()
层开始。)
特别是,我有一个非常大的.deb文件(超过3G),需要在映像中安装它。先FROM ubuntu
或COPY
然后再ADD
很容易,但这导致重复使用了我不需要的几GB空间。当然,仅删除文件并不会减小图像的大小。
我希望能够挂载一个卷来访问RUN dpkg -i
文件,而不是.deb
,这在运行容器时很容易做到,但是在运行容器时显然无法做到建立一个?
到目前为止,我想出的是将docker构建到我将COPY
放置到文件的位置,然后在安装了卷的情况下运行它,这样我就可以从容器中访问文件而无需{{ 1}}},然后ADD
,然后执行docker commit来从该容器创建映像。可以肯定的是,我最终得到的图像比我的第一次尝试小3GB以上,但这看起来像是骇客,并且使构建脚本更加复杂。
我认为必须有一种更合适的方法来实现这一目标,但是到目前为止,我的搜索还没有找到明显的答案。我想念什么吗?
答案 0 :(得分:1)
依靠docker commit
确实构成了黑客:),因此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 / /
而丢失)。