- 已关闭。**此问题为not about programming or software development。当前不接受答案。
此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site的主题有关,您可以留下评论,说明在何处可以回答此问题。
3天前关闭。
社区在3天前审查了是否重新讨论此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我通过Fedora的Dockerfile制作了一个简单的图像(最初为320 MB)。
添加了Nano(这个1MB大小的小编辑器),图像的大小增加到了530MB。我在上面添加了Git(30MB左右),然后我的图像大小飙升到了830MB。
是不是很疯狂?
我试过导出和导入容器来删除历史/中间映像。这一努力节省了25 MB,现在我的映像大小是804 MB。我也试过在一个RUN
上运行许多命令,但我仍然得到相同的初始830MB。
我怀疑是否值得使用Docker。我的意思是,我几乎没有安装任何东西,我打了1GB以上。如果我将不得不添加一些严重的东西,如数据库等,我可能会耗尽磁盘空间。
有没有人会因为图片尺寸太大而苦恼?你是怎么处理的?
除非我的Dockerfile是可怕的错误?
FROM fedora:latest
MAINTAINER Me NotYou <email@dot.com>
RUN yum -y install nano
RUN yum -y install git
但很难想象这里会出什么问题。
9条答案
按热度按时间zwghvu4y1#
正如@rexposadas所说,映像包括所有的层,每一层包括你安装的所有依赖项。同样重要的是要注意,基本映像(如
fedora:latest
)往往是非常简单的。你可能会惊讶于你安装的软件所依赖的数量。通过在每一行中添加
yum -y clean all
,我可以使您的安装明显更小:在每次运行时,在提交层之前进行清理是很重要的,否则删除操作实际上不会删除数据。也就是说,在联合/写入时复制文件系统中,在最后清理并不会真正减少文件系统的使用,因为实际数据已经提交到较低的层。要解决这个问题,必须在每一层进行清理。
ldfqzlk82#
Docker图像并不大,你只是在构建大图像。
scratch
的镜像是0B,如果你能把代码编译成静态二进制文件,你就可以用它来打包代码,例如,你可以把Go语言和package it on top ofscratch
编译成一个小于5MB的完全可用的镜像。关键是不要使用官方的Docker映像,它们太大了。Scratch也不是那么实用,所以我建议使用Alpine Linux作为你的基础映像。它大约是5MB,然后只添加你的应用程序所需的内容。这篇关于Microcontainers的文章告诉你如何在Alpine基础上构建非常小的映像。
更新:官方Docker图像现在是基于Alpine的,所以现在很好用。
3z6pesqy3#
Here are some more things you can do:
RUN
命令。尽可能多地使用一个RUN
命令(使用&&
)有了这些以及@Andy和@michau的建议,我能够将我的nodejs映像从1.062GB调整到542MB。
编辑:还有一件事很重要:* "我花了一段时间才真正理解,每个Dockerfile命令都会创建一个包含增量的新容器。[...]如果您在后面的命令中使用rm-rf命令来创建文件,这并不重要;它们继续存在于某个中间层容器中。"* 所以现在我设法将
apt-get install
、wget
、npm install
(具有git依赖项)和apt-get remove
放入一个RUN
命令中,所以现在我的映像只有438 MB。随着Docker v17.06有一个新的功能Dockerfiles:您可以在一个Docker文件中包含多个
FROM
语句,并且只有来自最后一个FROM
的内容才会出现在您的最终Docker映像中。这对于减小映像大小非常有用,例如:会得到一个只有nodejs基础图像和第一步中/var/my-project的内容的图像-但是没有ruby,python,git,openssh和gcc!
wnvonmuf4#
是的,那些尺寸太可笑了,我真的不知道为什么这么少人注意到这一点。
我做了一个Ubuntu镜像,它实际上是最小的(不像其他所谓的“最小”镜像),它叫做
textlab/ubuntu-essential
,有60MB。安装nano后,上面的图像是82 MB。
Git有更多的先决条件,所以图像会变大,大约192MB,这比大多数图像的初始大小还要小。
你也可以看看the script I wrote to make the minimal Ubuntu image for Docker,你也许可以把它适应Fedora,但是我不确定你能卸载多少。
muk1a3rh5#
以下内容对我帮助很大:
删除容器中未使用的软件包(例如,redis 1200 MB已释放)后,我完成了以下操作:
图层变平了,新图像的大小会变小,因为我已经如上所述从容器中删除了包。
这花了很多时间来理解这一点,这就是为什么我添加了我的评论。
628mspwn6#
最好的做法是,您应该执行一个RUN命令,因为Dockerfile中的每个RUN指令都会在图像中写入一个新图层,并且每个图层都需要额外的磁盘空间。为了将图层数量保持在最低限度,任何文件操作(如安装、移动、解压缩、删除等)都应该在一个RUN指令下执行
u4dcyp6a7#
Docker Squash是一个非常好的解决方案。您可以在最后一步中使用
$packagemanager clean
,而不是在每一行中,然后运行一个Docker Squash来摆脱所有的层。https://github.com/jwilder/docker-squash
nxagd54h8#
是的,图层系统是相当令人惊讶的。如果你有一个基础图像,你通过以下操作来增加它:
图像的大小完全相同。这本质上意味着,你必须设法在你的运行步骤中投入大量的提取,安装和清理魔法,使图像和安装的软件一样小。
这让生活变得更加艰难...
dockerBuild缺少未提交的RUN步骤。
mum43rcc9#
我们在构建docker的过程中也遇到了类似的问题。每个构建的映像都比其他映像大很多。结果发现,我们在映像中包含了tar.gz文件。这些文件中有我们上传到服务器的压缩映像。因此,每个映像都意外地包含了之前的映像。映像大小很快就达到了8gb。
.dockerignore是您的朋友。请确保项目中构建映像所不需要的任何内容都在ignore文件中。