为什么我的 docker 图像比 du -hd 1 /

why my docker image bigger than du -hd 1 /

当我使用 openjdk:8u171-alpine 构建我的 java 应用程序时。

图片尺寸比我想象的要大。

openjdk:8u171-alpine只有103MB,而我的测试jar文件大约有30MB。

但是我的新 docker 图片是 160MB。

我不知道why.So我用 docker run --rm -it openjdk:8u171-alpine du -hd 1输出结果如下

4.0K    ./home
4.0K    ./srv
1.6M    ./etc
4.0K    ./root
2.8M    ./lib
4.0K    ./mnt
95.8M   ./usr
16.0K   ./media
0       ./sys
0       ./dev
224.0K  ./sbin
784.0K  ./bin
4.0K    ./run
0       ./proc
4.0K    ./tmp
68.0K   ./var
101.3M  .

当我 运行 在我的 docker 图像中相同时

4.0K    /home
4.0K    /srv
1.6M    /etc
8.0K    /root
2.8M    /lib
4.0K    /mnt
95.8M   /usr
16.0K   /media
0       /sys
0       /dev
224.0K  /sbin
784.0K  /bin
4.0K    /run
0       /proc
4.0K    /tmp
68.0K   /var
29.8M   /app
4.0K    /logs
131.1M  /

只有131.1MB, 但是当我使用 docker images 时,输出显示 160MB

d3ac9dcbe21c   20 minutes ago   165MB

这是我的docker文件

FROM openjdk:8u171-alpine
MAINTAINER zhujiaxin<783725554@qq.com>
ENV LOGLEVEL=info
VOLUME ["/logs"]
RUN mkdir /app
WORKDIR /app
ARG JAR_FILE
COPY /target/$JAR_FILE app.jar
RUN chmod 775 app.jar
ENTRYPOINT ["java","-jar","app.jar"]
CMD []
EXPOSE 8080

我的jar文件只有30M

当我将 dockerfile 更改为

FROM openjdk:8u171-alpine
MAINTAINER zhujiaxin<783725554@qq.com>
ENV LOGLEVEL=info
VOLUME ["/logs"]
RUN mkdir /app && chmod 775 /app
WORKDIR /app
ARG JAR_FILE
COPY /target/$JAR_FILE app.jar
ENTRYPOINT ["java","-jar","app.jar"]
CMD []
EXPOSE 8080

新图像是134M,所以当运行一些命令时,运行它在文件复制之前。

新图层将从您的字典中复制文件。

docker 分层文件系统是写时复制,并且该复制是在文件级别,而不是单个文件系统块。这意味着使用 chmod 更改文件的权限位会导致将整个文件复制到新层:

COPY /target/$JAR_FILE app.jar
RUN chmod 775 app.jar

结果是一个 30MB 的文件将占用 space 的 2 倍,每个层一次,具有不同的权限。理想情况下,您会在源代码处修复文件权限以避免对文件进行 chmod 的需要。然后你只需要 COPY 步骤而不需要在 运行:

中添加 chmod
COPY /target/$JAR_FILE app.jar