Home > Software engineering >  why my docker image bigger than du -hd 1 /
why my docker image bigger than du -hd 1 /

Time:10-22

when i use openjdk:8u171-alpine to build my java application.

The image size is bigger than what i think.

The openjdk:8u171-alpine is only 103MB, and my test jar file about 30MB.

But my new docker images is 160MB.

I don't know why.So I use docker run --rm -it openjdk:8u171-alpine du -hd 1 .The output is as follows

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  .

and when I run same in my docker images

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  /

It only 131.1MB, but when I use docker images the output shows 160MB

d3ac9dcbe21c   20 minutes ago   165MB

This is my dockerfile

FROM openjdk:8u171-alpine
MAINTAINER zhujiaxin<[email protected]>
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

My jar file only 30M

CodePudding user response:

The docker layered filesystem is copy-on-write, and that copy is on a file level, not individual filesystem blocks. That means a change to a permission bit on a file with a chmod results in copying the entire file to a new layer:

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

The result is a 30MB file would take up 2x that space, once for each layer, with the different permissions. Ideally, you'd fix the file permissions at the source to avoid the need to chmod the file. Then you'd only need the COPY step without the added chmod in a RUN:

COPY /target/$JAR_FILE app.jar

CodePudding user response:

when i change dockerfile to

FROM openjdk:8u171-alpine
MAINTAINER zhujiaxin<[email protected]>
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

the new images is 134M,so when run some command,run it before file copy.

new layer will copy file from your dictionary.

  • Related