我无法理解为什么' 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当然比这个例子长得多,因此图像大小的增加也相当大。这就是我甚至关心的原因..
答案 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 ...
行注释掉的情况下,无论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
鉴于:
npm install
我明白了:
RewriteEngine On
RewriteCond $1 ^blog/
RewriteRUle ^(.*)$ /blog/$1 [L]
也就是说,这两个图像的大小大致相同( 差异大约是5 Kb)。
如果log_line_prefix
命令可以成功运行(因为这会安装其他文件),我当然希望得到的图像更大。
答案 1 :(得分:2)
遗憾的是,这是一个已知问题:ReactJS html body和https://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.在构建映像之前更改暂存文件夹中的权限。
通过更改所有权的引导脚本运行容器。
挤压图层!