gpt4 book ai didi

Dockerfile RUN 命令占用大量磁盘空间

转载 作者:行者123 更新时间:2023-12-02 18:16:09 24 4
gpt4 key购买 nike

我有一个带有这个 RUN 命令的 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

你知道为什么吗?

最佳答案

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

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

您可以通过一个非常简单的示例来验证此行为。考虑以下 Dockerfile :

FROM ubuntu:latest

RUN echo foo > /tmp/bar
RUN useradd foo
RUN chown foo /tmp/bar

现在使用 docker build 构建此镜像然后用 docker history <image-id> 检查它:
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

使用最顶层的 ID ( /bin/sh -c chown foo /tmp/bar) 并在 /var/lib/docker/aufs/diff/<ID>... 中查找此 ID (假设您使用 AUFS 作为存储驱动程序):
$ 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

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

关于Dockerfile RUN 命令占用大量磁盘空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40256610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com