我通过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

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


当前回答

这里还有一些你可以做的事情:

尽可能避免使用多个RUN命令。在一个RUN命令中放入尽可能多的内容(使用&&) 清理不必要的工具,如wget或git(你只需要下载或构建东西,但不需要运行你的进程)

有了这些和来自@Andy和@michau的建议,我能够将我的nodejs映像从1.062 GB调整到542 MB。

编辑: 还有一件重要的事情: “我花了一段时间才真正理解每个Dockerfile命令都创建了一个带有增量的新容器。[…如果你在以后的命令中rm -rf文件没有关系;它们继续存在于某些中间层容器中。” 所以现在我设法把apt-get install, wget, npm install(与git依赖)和apt-get remove放入一个单一的RUN命令,所以现在我的映像只有438 MB。

编辑29/06/17

在Docker v17.06中,Dockerfiles有了新的特性: 你可以在一个Dockerfile中有多个FROM语句,只有来自最后一个FROM的内容才会出现在最终的Docker映像中。这对于减小图像大小很有用,例如:

FROM nodejs as builder
WORKDIR /var/my-project
RUN apt-get install ruby python git openssh gcc && \
    git clone my-project . && \
    npm install

FROM nodejs
COPY --from=builder /var/my-project /var/my-project

将生成一个只有nodejs基本映像和第一步中/var/my-project的内容的映像,但没有ruby、python、git、openssh和gcc!

其他回答

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

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

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

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

是的,分层系统非常令人惊讶。 如果你有一个基本图像,你通过以下方式增加它:

# Test
#
# VERSION       1

# use the centos base image provided by dotCloud
FROM centos7/wildfly
MAINTAINER JohnDo 

# Build it with: docker build -t "centos7/test" test/

# Change user into root
USER root

# Extract weblogic
RUN rm -rf /tmp/* \
    && rm -rf /wildfly/* 

图像大小完全相同。这本质上意味着,您必须设法在RUN步骤中加入大量的提取、安装和清理魔法,以使映像与安装的软件一样小。

这让生活更加艰难……

dockerBuild在没有提交的情况下缺少RUN步骤。

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

我做了一个实际上是最小的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,但我不确定您能卸载多少。

为了最佳实践,您应该执行一个RUN命令,因为 Dockerfile中的每个RUN指令都在映像中写入一个新层,每一层都需要额外的磁盘空间。为了将层数保持在最小,任何文件操作,如安装、移动、提取、删除等,理想情况下都应该在单个RUN指令下完成

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

以下几点对我帮助很大:

在我的容器中删除未使用的包(例如redis 1200 mb自由)后,我做了以下工作:

docker export [containerID] -o containername.tar Docker import -m "commit message here" containername.tar imagename:标签

层变平了。新图像的大小会更小,因为我已经按照上面的说明从容器中删除了包。

我花了很多时间来理解这一点,这就是为什么我添加了我的评论。