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

我不明白为什么“chown”命令应该增加我的docker镜像的大小?

以下Dockerfile创build一个大小为5.3MB的图像:

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

然而,这个例子创build一个大小为8.7MB的图像:

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

为什么?

注意:我的实际docker文件当然比这个例子长得多,因此图像尺寸的增加也相当大。 这就是为什么我甚至在乎

Dockerfile中的每一步都会生成一个新的中间映像,即“层”,由上一层的文件系统上的任何内容组成。 一个docker映像由一个层叠的应用层组成,这个层叠层创build了最终的文件系统。

如果你有:

 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 

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

 / # du -sh /lib 3.4M /lib 

在你的例子中,究竟是哪一个图像大小发生了变化。

UPDATE

使用你的实际的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 

也就是说,这两个图像的大小大致相同(差别在5Kb左右)。

如果npm install命令可以成功运行(因为那样会安装额外的文件),我当然会期望得到的图像更大。

现在,您可以使用ImageLayers.io直观地查看图像及其图层,以便了解额外尺寸的原因。

docker历史也显示类似的东西。

这是一个已知的问题,不幸的是: https : //github.com/docker/docker/issues/5505和https://github.com/docker/docker/issues/6119#issuecomment-70606158

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