为什么chown会增加docker图像的大小?

时间:2015-05-06 19:13:13

标签: docker filesize chown dockerfile

我无法理解为什么' chown' 命令会增加我的泊坞窗图片的大小?

以下Dockerfile创建大小为5.3MB的图像:

FROM alpine:edge
RUN adduser example -D -h /example -s /bin/sh

然而,此示例创建了一个大小为8.7MB的图像:

FROM alpine:edge
RUN adduser example -D -h /example -s /bin/sh && \
    chown -R example.example /lib

为什么吗

注意:我的实际dockerfile当然比这个例子长得多,因此图像大小的增加也相当大。这就是我甚至关心的原因..

4 个答案:

答案 0 :(得分:7)

Dockerfile中的每一步都会生成一个新的中间图像,或者#34; layer",它包含在上一层文件系统上发生变化的任何内容。 docker镜像由一组图层组成,这些图层一个在另一个上面应用,以创建最终的文件系统。

如果你有:

RUN adduser example -D -h /example -s /bin/sh

然后你可能只更改/etc/etc/passwd/etc/group中的几个文件以及它们的阴影等效文件。

如果你有:

RUN adduser example -D -h /example -s /bin/sh && \
    chown -R example.example /lib

然后,已经改变的事物列表递归地包括/lib中可能更大的所有内容。事实上,在我的alpine:edge容器中,/lib的内容看起来像是3.4MB:

/ # du -sh /lib
3.4M    /lib

确切地说明了示例中图像大小的变化。

<强>更新

使用实际的Dockerfile,在npm install ...行注释掉的情况下,无论adduserchown命令是否为RUN echo "http://nl.alpinelinux.org/alpine/edge/main" > /etc/apk/repositories && \ echo "http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && \ apk add -U wget iojs && \ apk upgrade && \ wget -q --no-check-certificate https://ghost.org/zip/ghost-0.6.0.zip -O /tmp/ghost.zip && \ unzip -q /tmp/ghost.zip -d /ghost && \ cd /ghost && \ # npm install --production && \ sed 's/127.0.0.1/0.0.0.0/' /ghost/config.example.js > /ghost/config.js && \ sed -i 's/"iojs": "~1.2.0"/"iojs": "~1.6.4"/' package.json && \ # adduser ghost -D -h /ghost -s /bin/sh && \ # chown -R ghost.ghost * && \ npm cache clean && \ rm -rf /var/cache/apk/* /tmp/* $ docker build -t sotest . [...] Successfully built 058d9f41988a $ docker inspect -f '{{.VirtualSize}}' 058d9f41988a 31783340 命令,我都不会发现最终图像大小有任何差异跑。给出:

RUN echo "http://nl.alpinelinux.org/alpine/edge/main" > /etc/apk/repositories && \
    echo "http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && \
    apk add -U wget iojs && \
    apk upgrade && \
    wget -q --no-check-certificate https://ghost.org/zip/ghost-0.6.0.zip -O /tmp/ghost.zip && \
    unzip -q /tmp/ghost.zip -d /ghost && \
    cd /ghost && \
#    npm install --production && \
    sed 's/127.0.0.1/0.0.0.0/' /ghost/config.example.js > /ghost/config.js && \
    sed -i 's/"iojs": "~1.2.0"/"iojs": "~1.6.4"/' package.json && \
    adduser ghost -D -h /ghost -s /bin/sh && \
    chown -R ghost.ghost * && \
    npm cache clean && \
    rm -rf /var/cache/apk/* /tmp/*

我明白了:

$ docker build -t sotest .
[...]
Successfully built 696b481c5790
$ docker inspect -f '{{.VirtualSize}}' 696b481c5790
31789262

鉴于:

npm install

我明白了:

RewriteEngine On
RewriteCond $1 ^blog/
RewriteRUle ^(.*)$ /blog/$1 [L]

也就是说,这两个图像的大小大致相同( 差异大约是5 Kb)。

如果log_line_prefix命令可以成功运行(因为这会安装其他文件),我当然希望得到的图像更大。

答案 1 :(得分:2)

遗憾的是,这是一个已知问题:ReactJS html bodyhttps://github.com/docker/docker/issues/5505

您可以通过将docker存储驱动程序从aufs更改为devicemapper来解决此问题,如https://github.com/docker/docker/issues/6119#issuecomment-70606158

中所述

答案 2 :(得分:1)

现在您可以检查您的图像&amp;它的图层可视化使用ImageLayers.io来帮助查看额外大小的原因。

也 码头历史显示类似的东西。

答案 3 :(得分:1)

由于Docker 17.09可以在Dockerfile中的ADD / COPY操作中使用--chown标志来更改ADD / COPY步骤本身的所有者而不是单独的带有chown的RUN操作,这会增加图像的大小,如您所注意到的。将此作为默认模式是好的,即复制文件的用户的权限应用于复制的文件。但是,Docker团队不想破坏向后兼容性,因此引入了新的标志。

COPY --chown =:

其他替代方案是: 1.在构建映像之前更改暂存文件夹中的权限。

  1. 通过更改所有权的引导脚本运行容器。

  2. 挤压图层!