我通过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!
正如@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
这里还有一些你可以做的事情:
尽可能避免使用多个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!