正在移除Docker中上一层中添加的内容

v1uwarro  于 2022-11-22  发布在  Docker
关注(0)|答案(4)|浏览(127)

我尝试缩小我的docker图像的大小。在我的docker文件中,我这样做:

FROM crystal/centos
MAINTAINER crystal

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

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

n53p2ov0

n53p2ov01#

使用此技术

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

q7solyqu2#

你不能从以前的图层中删除数据。如果/rpms/文件夹很大,你绝对不希望它的数据出现在你的docker图像中,你至少有两个解决方案:

  • 不对数据执行ADD操作(因为它将提交一个层),而是使用单个RUN指令执行以下操作:
  • 下载rpm文件
  • 安装rpm文件
  • 删除rpm文件
  • 之后
mftmpeh8

mftmpeh83#

你可以做

RUN rm -rf /rpms

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

a0zr77ik

a0zr77ik4#

在关于挂载docker镜像到主机文件系统的问题中,我已经介绍了docker如何存储镜像的一些内部结构。
对于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/中删除相应目录。

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

相关问题