我通过Fedora上的Dockerfile制作了一个简单的图像(最初是320 MB)。

添加Nano(这个1MB大小的小编辑器),图像的大小上升到530 MB。我在上面添加了Git(大约30 MB),然后我的图像大小飙升到830 MB。

这是不是很疯狂?

我尝试过导出和导入容器来删除历史/中间图像。这节省了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

但很难想象这里会出什么问题。


当前回答

正如@rexposadas所说,图像包括所有层,每个层包括您安装的所有依赖项。同样重要的是要注意基础图像(如fedora:latest)往往非常简单。您可能会对所安装的软件所具有的依赖项的数量感到惊讶。

通过在每一行中添加yum -y clean all,我可以使您的安装显着变小:

FROM fedora:latest
RUN yum -y install nano && yum -y clean all
RUN yum -y install git && yum -y clean all

重要的是,在提交层之前,每次RUN都要这样做,否则删除并不实际删除数据。也就是说,在联合/写时复制文件系统中,最后的清理并不会真正减少文件系统的使用,因为实际数据已经提交到较低的层。为了解决这个问题,你必须清洗每一层。

$ docker history bf5260c6651d
IMAGE               CREATED             CREATED BY                                      SIZE
bf5260c6651d        4 days ago          /bin/sh -c yum -y install git; yum -y clean a   260.7 MB
172743bd5d60        4 days ago          /bin/sh -c yum -y install nano; yum -y clean    12.39 MB
3f2fed40e4b0        2 weeks ago         /bin/sh -c #(nop) ADD file:cee1a4fcfcd00d18da   372.7 MB
fd241224e9cf        2 weeks ago         /bin/sh -c #(nop) MAINTAINER Lokesh Mandvekar   0 B
511136ea3c5a        12 months ago                                                       0 B

其他回答

正如@rexposadas所说,图像包括所有层,每个层包括您安装的所有依赖项。同样重要的是要注意基础图像(如fedora:latest)往往非常简单。您可能会对所安装的软件所具有的依赖项的数量感到惊讶。

通过在每一行中添加yum -y clean all,我可以使您的安装显着变小:

FROM fedora:latest
RUN yum -y install nano && yum -y clean all
RUN yum -y install git && yum -y clean all

重要的是,在提交层之前,每次RUN都要这样做,否则删除并不实际删除数据。也就是说,在联合/写时复制文件系统中,最后的清理并不会真正减少文件系统的使用,因为实际数据已经提交到较低的层。为了解决这个问题,你必须清洗每一层。

$ docker history bf5260c6651d
IMAGE               CREATED             CREATED BY                                      SIZE
bf5260c6651d        4 days ago          /bin/sh -c yum -y install git; yum -y clean a   260.7 MB
172743bd5d60        4 days ago          /bin/sh -c yum -y install nano; yum -y clean    12.39 MB
3f2fed40e4b0        2 weeks ago         /bin/sh -c #(nop) ADD file:cee1a4fcfcd00d18da   372.7 MB
fd241224e9cf        2 weeks ago         /bin/sh -c #(nop) MAINTAINER Lokesh Mandvekar   0 B
511136ea3c5a        12 months ago                                                       0 B

是的,这些尺寸是荒谬的,我真的不知道为什么很少有人注意到这一点。

我做了一个实际上是最小的Ubuntu映像(不像其他所谓的“最小”映像)。它叫做textlab/ubuntu-essential,有60mb。

FROM textlab/ubuntu-essential
RUN apt-get update && apt-get -y install nano

上面的图像是安装nano后的82 MB。

FROM textlab/ubuntu-essential
RUN apt-get update && apt-get -y install nano git

Git有更多的先决条件,因此映像变得更大,大约192 MB。这仍然小于大多数映像的初始大小。

你也可以看看我为Docker编写的最小Ubuntu映像脚本。您或许可以将其调整为Fedora,但我不确定您能卸载多少。

Docker映像并不大,你只是在构建大型映像。

草稿图像是0B,如果可以将代码编译成静态二进制文件,则可以使用它来打包代码。例如,您可以编译Go程序并将其打包到scratch之上,以生成一个小于5MB的完全可用的映像。

关键是不要使用官方的Docker映像,它们太大了。Scratch也不是那么实用,所以我建议使用Alpine Linux作为您的基础映像。它大约是5MB,然后只添加你的应用程序所需的东西。这篇关于微容器的文章向你展示了如何基于Alpine构建非常小的图像。

更新:官方的Docker映像现在是基于alpine的,所以现在可以很好地使用。

我们在docker构建过程中遇到了类似的问题。每个构建的图像都明显比其他图像大。事实证明,我们在映像中包含了tar.gz文件。其中包括我们上传到服务器上的压缩图像。所以每个图像都偶然地包含了先前的图像。图像大小很快就在8gb范围内。

.dockerignore是你的朋友。确保项目中与构建图像无关的任何内容都在忽略文件中。

Docker Squash是一个非常好的解决方案。你可以在最后一步清除$packagemanager,而不是在每一行中,然后运行一个docker squash来摆脱所有的层。

https://github.com/jwilder/docker-squash