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

时间:2018-09-06 20:42:32

标签: docker dockerfile docker-build

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

特别是,我有一个非常大的.deb文件(超过3G),需要在映像中安装它。先FROM ubuntuCOPY然后再ADD很容易,但这导致重复使用了我不需要的几GB空间。当然,仅删除文件并不会减小图像的大小。

我希望能够挂载一个卷来访问RUN dpkg -i文件,而不是.deb,这在运行容器时很容易做到,但是在运行容器时显然无法做到建立一个?

到目前为止,我想出的是将docker构建到我将COPY放置到文件的位置,然后在安装了卷的情况下运行它,这样我就可以从容器中访问文件而无需{{ 1}}},然后ADD,然后执行docker commit来从该容器创建映像。可以肯定的是,我最终得到的图像比我的第一次尝试小3GB以上,但这看起来像是骇客,并且使构建脚本更加复杂。

我认为必须有一种更合适的方法来实现这一目标,但是到目前为止,我的搜索还没有找到明显的答案。我想念什么吗?

1 个答案:

答案 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 / /而丢失)。