您是否通过以下方式构建该图像:Dockerfile?当你这样做时,请照顾好你的RUN
声明。当你执行多个RUN
声明对于每一个新图像layer被建造它保留在图像历史记录中并依赖于图像总大小。
例如,如果一个RUN
语句下载一个巨大的存档文件,下一条语句解压该存档文件,然后一条语句清理该存档文件and其提取的文件留在图像历史中:
RUN curl <options> http://example.com/my/big/archive.tar.gz
RUN tar xvzf <options>
RUN <do whatever you need to do with the unpacked files>
RUN rm archive.tar.gz
就图像大小而言,有更有效的方法可以将多个步骤合并为一个RUN
声明使用&&
操作员。喜欢:
RUN curl <options> http://example.com/my/big/archive.tar.gz \
&& tar xvzf <options> \
&& <do whatever you need to do with the unpacked files> \
&& rm archive.tar.gz
通过这种方式,您可以清理构建过程所需但不在生成的映像中的文件和文件夹,并将它们保留在映像历史记录之外。这是保持较小图像尺寸的一种非常常见的模式。
但是,当然,您不会拥有可以重用的细粒度图像历史记录。
Update:
也RUN
声明ADD
语句还创建新的图像层。无论您以这种方式添加到图像中什么留在历史中并计算总图像大小。你暂时不能ADD
things然后删除它们,以便它们不计入总大小。
Try to ADD
尽可能少的图像。特别是当您处理大文件时。是否有其他方法可以临时获取这些文件RUN
声明,以便您可以在同一期间进行清理RUN
执行?例如。RUN git clone <your repo> && <do stuff> && rm -rf <clone dir>
?
一个好的做法是只ADD
那些应该留在图像上的东西。临时的东西应该添加并用一个单一的清理RUN
在可能的情况下改为声明。