减少层数后 Docker 镜像尺寸增大

问题描述 投票:0回答:1

我读到合并 docker 层并删除不必要的包应该会减少最终图像的大小。

我有这个 Dockerfile,它根据

docker inspect
生成一个具有 14 层且大小为 583MB 的图像:

FROM tomcat:9.0-jdk17-temurin-jammy
RUN <<-EOF
  set -e
  echo 'org.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource' >> ./conf/catalina.properties
  mkdir -p /usr/local/tomcat/temp/Reports /usr/local/tomcat/temp/File_Import/ /var/log/mylog/
  apt-get update && apt-get install -y nano-tiny \
  && rm -rf /var/lib/apt/lists/*
EOF
COPY Artefacts/Portal/context.xml Artefacts/Portal/server.xml /usr/local/tomcat/conf/
COPY Artefacts/Portal/*.jar /usr/local/tomcat/lib/
COPY Artefacts/Portal/myapp.war /usr/local/tomcat/webapps/
COPY Artefacts/Portal/SelfSigned.jks /usr/local/tomcat/conf/
HEALTHCHECK --interval=5s --timeout=5s --start-period=30s --retries=10 \
  CMD curl --fail --silent --insecure https://localhost:443/myapp/ || exit 1
ENV CATALINA_OPTS="-Xms2G -Xmx2G"
EXPOSE 443 8443 8080

为了减小大小,我尝试重构它,删除不需要的包,并将

COPY
RUN
层与以下 Dockerfile 合并(相同的基础镜像,层 = 11,大小 = 736MB)

FROM tomcat:9.0-jdk17-temurin-jammy
COPY Artefacts/Portal /tmp/
RUN <<-EOF
  set -eux
  echo 'org.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource' >> ./conf/catalina.properties
  mkdir -p /usr/local/tomcat/temp/Reports /usr/local/tomcat/temp/File_Import/ /var/log/mylog/
  mv /tmp/*.xml /usr/local/tomcat/conf/
  mv /tmp/*.jar /usr/local/tomcat/lib/
  mv /tmp/SelfSigned.jks /usr/local/tomcat/conf/
  mv /tmp/myapp.war /usr/local/tomcat/webapps/
EOF
HEALTHCHECK --interval=5s --timeout=5s --start-period=30s --retries=10 \
  CMD curl --fail --silent --insecure https://localhost:443/myapp/ || exit 1
ENV CATALINA_OPTS="-Xms2G -Xmx2G"
EXPOSE 443 8443 8080

请注意,我现在向

COPY
发出一个
/tmp
,然后将文件移动到已存在的
RUN
层中。这去除了 3 层。

然而,令我惊讶的是尺寸增加了。

我做错了什么?我正在使用 Docker 版本 27.2.0,在 Apple M1 上构建 3ab4256。

docker dockerfile
1个回答
0
投票

我使用

docker history --human
钻取新图像并看到:

<missing>             8 minutes ago   RUN /bin/sh -c   set -eux
  echo 'org.apache…   153MB           buildkit.dockerfile.v0
<missing>             8 minutes ago   COPY Artefacts/Portal /tmp/ # buildkit          153MB     buildkit.dockerfile.v0

因此,现在在

RUN
层中引入了 153MB,因为
RUN
必须将
mv
ied 文件移动到其位置,因此其大小会增加。
在第一个 Dockerfile 中,多个 

COPY

命令将文件放在最终位置。我的假设是,如果我使用一个

COPY
COPY
,然后重复使用已经存在的
/tmp/
RUN
这些文件,我将消除 3 个
mv
层,并且最终图像的大小应该减小.
我错了,因为我通过向其添加新职责来扩大 

COPY

层的大小:使其在

RUN
ied 文件中移动。
    

© www.soinside.com 2019 - 2024. All rights reserved.