首页 > 解决方案 > 为什么 Dockerfile 中的相同 RUN 命令会导致镜像之间的层大小不同?

问题描述

我在两个不同的 Dockerfile 中使用完全相同的部分(在这两种情况下,基础都是 ubuntu:18.04),它们使用 wget 从远程位置下载两个文件。

ENV ROBOT v1.5.0
ENV ROBOT_JAR=https://github.com/ontodev/robot/releases/download/$ROBOT/robot.jar
RUN wget $ROBOT_JAR -O /tools/robot.jar && \
    wget https://raw.githubusercontent.com/ontodev/robot/$ROBOT/bin/robot -O /tools/robot && \
    chmod +x /tools/*

docker history --no-trunc [...]

告诉我在一个 Dockerfile 中,这个命令创建的层是 114 MB:

... /bin/sh -c wget $ROBOT_JAR -O /tools/robot.jar &&     wget https://raw.githubusercontent.com/ontodev/robot/$ROBOT/bin/robot -O /tools/robot &&     chmod +x /tools/* 114MB   

而另一个只有 44.9MB:

... /bin/sh -c wget $ROBOT_JAR -O /tools/robot.jar &&     wget https://raw.githubusercontent.com/ontodev/robot/$ROBOT/bin/robot -O /tools/robot &&     chmod +x /tools/* 44.9MB              

除了相同的基础之外,Dockerfiles 当然是非常不同的(例如,114MB 的文件很大,而 45MB 的文件只有两个定义的层);我很好奇:什么可能导致尺寸差异?可以以某种方式减轻这种情况吗?

编辑1:

这是 114 MB 的案例:https ://github.com/INCATools/ontology-development-kit/blob/master/Dockerfile

这是另一个:https ://github.com/INCATools/ontology-development-kit/blob/master/docker/testdocker/Dockerfile

标签: dockerdockerfile

解决方案


chmod +x就是原因。每次更改文件时,即使只是chmodchown,文件的全新副本都会存储在下一层中。

您可以使用多阶段构建来创建没有所有中间层的最终图像,例如,如果您使用的是 Python,这里有一个指南:https ://pythonspeed.com/articles/smaller-python-docker -图片/

这是通用的 Docker 文档:https ://docs.docker.com/develop/develop-images/multistage-build/


推荐阅读