docker - 为什么 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
解决方案
这chmod +x
就是原因。每次更改文件时,即使只是chmod
或chown
,文件的全新副本都会存储在下一层中。
您可以使用多阶段构建来创建没有所有中间层的最终图像,例如,如果您使用的是 Python,这里有一个指南:https ://pythonspeed.com/articles/smaller-python-docker -图片/
这是通用的 Docker 文档:https ://docs.docker.com/develop/develop-images/multistage-build/
推荐阅读
- css - 仅使用 flexbox CSS 像网格一样对齐 flex 项目
- c - OpenSSL C API 实现 openssl asn1parse 逻辑
- python - 为什么我会收到“AttributeError:'list' 对象没有属性'encode'”?
- mongodb - 消息应用程序的 MongoDB 聚合查询
- r - 定义将pdf转换为cdf的函数时出现多个参数的问题
- python - 烧瓶路由重定向后如何处理数据
- c++ - 试图通过输入一个字母来退出 C++ 程序
- python - OSError:[Errno 9] 尝试写入 json 文件时出现错误的文件描述符
- mysql - 一个用例的 MySQL Query 帮助
- java - 无论我做什么,Spring Boot 应用程序中的 JSP 都会产生 404 错误