为什么我的 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
当我使用 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 步骤而不需要在 运行:
中添加 chmodCOPY /target/$JAR_FILE app.jar