为什么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 ...
行注释掉的时候,我看不出在最终的图像大小上adduser
和chown
命令是否运行。 鉴于:
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