Dockerfile运行命令占用大量磁盘空间

Dockerfile运行命令占用大量磁盘空间,docker,dockerfile,Docker,Dockerfile,我有一个带有以下运行命令的Dockerfile: RUN ln -s /usr/java/jdk1.5.0_22 /usr/java/java-5-sun && \ ln -s /usr/java/jdk1.5.0_22 /usr/java/jdk1.5 && \ ln -s /usr/java/jdk1.6.0_45 /usr/java/java-6-sun && \ ln -s /usr/java/jdk1.6.0_45 /usr/java/j

我有一个带有以下运行命令的Dockerfile:

RUN ln -s /usr/java/jdk1.5.0_22 /usr/java/java-5-sun && \
ln -s /usr/java/jdk1.5.0_22 /usr/java/jdk1.5 && \
ln -s /usr/java/jdk1.6.0_45 /usr/java/java-6-sun && \
ln -s /usr/java/jdk1.6.0_45 /usr/java/jdk1.6 && \
ln -s /usr/java/jdk1.7.0_79 /usr/java/java-7-sun && \
ln -s /usr/java/jdk1.7.0_79 /usr/java/jdk1.7 && \
ln -s /usr/java/jdk1.8.0_60 /usr/java/java-8-sun && \
ln -s /usr/java/jdk1.8.0_60 /usr/java/jdk1.8 && \
chown -R user.root /usr/java
但是,正如我从历史上看到的,它占用了大量的磁盘空间

/bin/sh -c ln -s /usr/java/jdk1.5.0_22 /usr/j   1.019 GB

你知道为什么吗?

如果我正确理解了这个问题,你会想,为什么这个特定的图像层的大小是1Gib,而你所做的只是创建一些新的符号链接。对的(为什么四种不同的JDK的大小都很大应该不言自明)

键是
chown user.root/usr/java
语句。我强烈怀疑此语句会导致更改权限的文件(即可能整个
/usr/java
目录)再次添加到图像中的此层

您可以用一个非常简单的示例来验证这种行为。考虑下面的代码<代码> DOCKFrase<代码>:< /P>
FROM ubuntu:latest

RUN echo foo > /tmp/bar
RUN useradd foo
RUN chown foo /tmp/bar
现在使用
docker build
构建此图像,然后使用
docker history
检查它:

使用最顶层的ID(
/bin/sh-c chown foo/tmp/bar
)并在
/var/lib/docker/aufs/diff/…
中查找此ID(假设您使用的是aufs作为存储驱动程序):


如您所见,在构建过程中更改文件的权限会导致在下一个图像层中再次添加该文件。更改所有Java SDK的权限会导致所有这些SDK(大小约为1 GiB)都添加到附加的图像层。

您在这里向我们展示了什么?
1.019GB
是从哪里来的?为什么要这么多jdk?为什么不提供压缩磁盘大小所需的版本?@yaron是“docker history command”的输出@Rao我们有不同jdk版本的项目,所以目前我们需要保留编译所需的所有版本是的,你明白了。我怀疑问题在于,现在我确定。谢谢
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
fdd96781f94f        5 seconds ago       /bin/sh -c chown foo /tmp/bar                   4 B                 
7237dbee1999        6 seconds ago       /bin/sh -c useradd foo                          330.3 kB            
69ed7323a0b0        6 seconds ago       /bin/sh -c echo foo > /tmp/bar                  4 B                 
17b6a9e179d7        5 months ago        /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B                 
b0c2dfa2701f        5 months ago        /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.895 kB            
202e40f8bb3a        5 months ago        /bin/sh -c rm -rf /var/lib/apt/lists/*          0 B                 
acb8e44f43fa        5 months ago        /bin/sh -c set -xe   && echo '#!/bin/sh' > /u   701 B               
487bffc61de6        5 months ago        /bin/sh -c #(nop) ADD file:ffc85cfdb5e66a5b4f   120.8 MB            
$ find /var/lib/docker/aufs/diff/fdd96781f94feee4a6db44b11f7f9411c52238458ceeef202b2203e77b9970f4
/var/lib/docker/aufs/diff/fdd96781f94feee4a6db44b11f7f9411c52238458ceeef202b2203e77b9970f4
/var/lib/docker/aufs/diff/fdd96781f94feee4a6db44b11f7f9411c52238458ceeef202b2203e77b9970f4/tmp
/var/lib/docker/aufs/diff/fdd96781f94feee4a6db44b11f7f9411c52238458ceeef202b2203e77b9970f4/tmp/bar