我读到合并 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 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 文件中移动。