【问题标题】:Why does the same RUN command in a Dockerfile lead to different layer sizes across images?为什么 Dockerfile 中的相同 RUN 命令会导致镜像之间的层大小不同?
【发布时间】:2020-01-24 10:42:02
【问题描述】:

我在两个不同的 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

【问题讨论】:

  • 图片中/tools目录下还有其他东西吗?您能否就这两个 Dockerfile 中发生的其他情况提供更多背景信息?
  • 感谢您的关注!我用两个有问题的 dockerfile 的链接更新了这个问题。是的,/tools 目录中还有很多东西。这会起作用吗?

标签: docker dockerfile


【解决方案1】:

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

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

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

【讨论】:

猜你喜欢
  • 2022-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多