首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dockerfile运行命令占用大量磁盘空间

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

Stack Overflow用户
提问于 2016-10-26 07:51:52
回答 1查看 169关注 0票数 2

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

代码语言:javascript
复制
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

但是,正如我从历史上看到的,它占用了大量的磁盘空间!!

代码语言:javascript
复制
/bin/sh -c ln -s /usr/java/jdk1.5.0_22 /usr/j   1.019 GB

你知道为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-26 15:22:02

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

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

您可以用一个非常简单的例子来验证这种行为。考虑下面的Dockerfile

代码语言:javascript
复制
FROM ubuntu:latest

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

现在用docker build构建这个映像,然后用docker history <image-id>检查它

代码语言:javascript
复制
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            

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

代码语言:javascript
复制
$ 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的权限,会导致将所有这些权限(大小为1 GiB )添加到额外的图像层。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40256610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档