删除docker中前一层添加的内容

我正在努力缩小我的docker图像的大小。 在我的docker文件中,我这样做:

FROM crystal/centos MAINTAINER crystal ADD ./rpms/test.rpm ./rpms/ RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 

据我所知,ADD命令是在自己的层,然后运行在另一层。 所以在我安装rpm之后,我该如何去删除初始/rpms目录。

使用这种技术

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

你不能删除以前的图层数据。 如果/rpms/文件夹非常庞大,并且绝对不希望将其数据存放在您的泊坞窗图像中,则至less有两个解决scheme:

  1. 不要ADD数据(因为它会提交一个图层),而是使用单个 RUN指令来:
    • 下载rpm文件
    • 安装rpm文件
    • 删除rpm文件
  2. 事后平整你的形象

你可以做

 RUN rm -rf /rpms 

这将使最终的联盟文件系统更小。 也就是说,df会报告更less的使用情况。 这当然不会使图像数据库变小,而是稍微大一点。 如果你想避免使数据库变大,你可以创build自己的yum版本库,然后直接从那里安装。 这有明显的缺点,它不会被任何人无法访问你的百胜回购重现。

有关将docker镜像安装到主机文件系统的问题,我已经介绍了docker如何存储镜像的一些内部结构。 你可以参考这个问题是否有可能挂载一个泊坞窗图像,然后作为一个普通的目录或挂载的设备访问它(RO)?

对于AUFSgraphics驱动程序,docker(至less在版本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/

注意:我没有尝试这个。 这可能不适合你,甚至可能是危险的。