删除docker中先前图层中添加的内容

时间:2014-10-28 15:41:52

标签: docker

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

FROM crystal/centos
MAINTAINER crystal

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

据我所知,ADD命令在它自己的层中,然后RUN在另一层。因此,在安装rpm之后,如何删除初始/rpms目录。

4 个答案:

答案 0 :(得分:8)

使用这种技术

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

你可以做到

RUN rm -rf /rpms

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

答案 3 :(得分:1)

关于将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/中删除相应的目录。

注意:我没试过。这可能对你不起作用,甚至可能是危险的。