【问题标题】:Removing what was added in previous layer in docker删除 docker 上一层中添加的内容
【发布时间】:2020-10-24 12:49:13
【问题描述】:

我正在尝试减小 docker 映像的大小。在我的 docker 文件中,我这样做:

FROM crystal/centos
MAINTAINER crystal

ADD ./rpms/test.rpm ./rpms/ 
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 

据我了解,ADD 命令在它自己的层,然后 RUN 在另一层。所以在我安装完 rpm 之后,我该如何删除初始的/rpms 目录。

【问题讨论】:

    标签: docker


    【解决方案1】:

    使用这种技术

    RUN curl http://someaddress/test.rpm &&\
        yum -y --nogpgcheck localinstall /rpms/test.rpm &&\
        rm test.rpm
    

    【讨论】:

    • 如果 rpm 托管在某处,您可以运行 yum -y install someaddress/test.rpm
    • 我的情况是——出于安全原因,我正在下载中间层的包。然后,将它们添加到最终图像中。随后使用 RUN 命令安装软件包并删除软件包。我的目标是在 RUN 命令安装它们后删除下载的包。有什么方法可以 a) 将 ADD 和 RUN 合并为一层; b) 删除 ADD 层?
    【解决方案2】:

    您无法从之前的图层中删除数据。如果/rpms/ 文件夹很大并且您绝对不希望它的数据出现在您的 docker 映像中,那么您至少有两种解决方案:

    1. 不要ADD 数据(因为它会提交一层),而是使用单个 RUN 指令来:
      • 下载 rpm 文件
      • 安装rpm文件
      • 删除 rpm 文件
    2. flatten your image 之后

    【讨论】:

      【解决方案3】:

      你可以的

      RUN rm -rf /rpms
      

      这将使最终的联合文件系统更小。也就是说, df 将报告较少的使用情况。它当然不会使图像数据库变小,而是稍微变大一点。如果您想避免使您的数据库变得更大,您可以创建自己的 yum 存储库并直接从那里安装。这有一个明显的缺点,任何人都无法在没有访问您的 yum 存储库的情况下复制它。

      【讨论】:

        【解决方案4】:

        关于将 docker 映像挂载到主机文件系统的问题,我已经介绍了 docker 如何存储其映像的一些内部结构。你可以参考这个问题Is it possible to mount a docker image and then access it (RO) as a normal directory or mounted device?

        对于 AUFS 图形驱动程序,docker(至少在 1.2 或更高版本中)会:

        • 将容器层存储在目录/var/lib/docker/aufs/diff
        • 将容器包含的层列表保存在简单的文本文件/var/lib/docker/aufs/layers/${CONTAINER_ID}中。

        因此,如果您想从容器中删除一些中间层,您可以尝试从 /var/lib/docker/aufs/layers/${CONTAINER_ID} 中删除特定行,然后从 /var/lib/docker/aufs/diff/ 中删除相应目录。

        注意:我没有尝试过。这可能对您不起作用,甚至可能很危险。

        【讨论】:

        • 主要问题是每次构建图像​​时都会恢复图层。我不得不说 IMO 使用这样的文件系统很危险,而且通常是个坏主意。
        • 完全同意你的看法。
        猜你喜欢
        • 2010-09-14
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多