为什么Docker容器图像这么大?[已关闭]

wxclj1h5  于 2023-01-29  发布在  Docker
关注(0)|答案(9)|浏览(137)

此问题似乎与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

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

zwghvu4y

zwghvu4y1#

正如@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

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

$ 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
ldfqzlk8

ldfqzlk82#

Docker图像并不大,你只是在构建大图像。
scratch的镜像是0B,如果你能把代码编译成静态二进制文件,你就可以用它来打包代码,例如,你可以把Go语言和package it on top of scratch编译成一个小于5MB的完全可用的镜像。
关键是不要使用官方的Docker映像,它们太大了。Scratch也不是那么实用,所以我建议使用Alpine Linux作为你的基础映像。它大约是5MB,然后只添加你的应用程序所需的内容。这篇关于Microcontainers的文章告诉你如何在Alpine基础上构建非常小的映像。
更新:官方Docker图像现在是基于Alpine的,所以现在很好用。

3z6pesqy

3z6pesqy3#

Here are some more things you can do

  • 尽可能避免使用多个RUN命令。尽可能多地使用一个RUN命令(使用&&
  • 清理不必要的工具,如wget或git(您只需要下载或构建一些东西,但不需要运行您的进程)

有了这些以及@Andy和@michau的建议,我能够将我的nodejs映像从1.062GB调整到542MB。
编辑:还有一件事很重要:* "我花了一段时间才真正理解,每个Dockerfile命令都会创建一个包含增量的新容器。[...]如果您在后面的命令中使用rm-rf命令来创建文件,这并不重要;它们继续存在于某个中间层容器中。"* 所以现在我设法将apt-get installwgetnpm install(具有git依赖项)和apt-get remove放入一个RUN命令中,所以现在我的映像只有438 MB。

    • 2017年6月29日编辑**

随着Docker v17.06有一个新的功能Dockerfiles:您可以在一个Docker文件中包含多个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!

wnvonmuf

wnvonmuf4#

是的,那些尺寸太可笑了,我真的不知道为什么这么少人注意到这一点。
我做了一个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有更多的先决条件,所以图像会变大,大约192MB,这比大多数图像的初始大小还要小。
你也可以看看the script I wrote to make the minimal Ubuntu image for Docker,你也许可以把它适应Fedora,但是我不确定你能卸载多少。

muk1a3rh

muk1a3rh5#

以下内容对我帮助很大:

删除容器中未使用的软件包(例如,redis 1200 MB已释放)后,我完成了以下操作:

  1. Docker导出[容器ID] -o容器名称. tar
  2. docker import -m“在此提交消息”容器名称. tar图像名称:标记
    图层变平了,新图像的大小会变小,因为我已经如上所述从容器中删除了包。
    这花了很多时间来理解这一点,这就是为什么我添加了我的评论。
628mspwn

628mspwn6#

最好的做法是,您应该执行一个RUN命令,因为Dockerfile中的每个RUN指令都会在图像中写入一个新图层,并且每个图层都需要额外的磁盘空间。为了将图层数量保持在最低限度,任何文件操作(如安装、移动、解压缩、删除等)都应该在一个RUN指令下执行

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

u4dcyp6a7#

Docker Squash是一个非常好的解决方案。您可以在最后一步中使用$packagemanager clean,而不是在每一行中,然后运行一个Docker Squash来摆脱所有的层。
https://github.com/jwilder/docker-squash

nxagd54h

nxagd54h8#

是的,图层系统是相当令人惊讶的。如果你有一个基础图像,你通过以下操作来增加它:

# 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/*

图像的大小完全相同。这本质上意味着,你必须设法在你的运行步骤中投入大量的提取,安装和清理魔法,使图像和安装的软件一样小。
这让生活变得更加艰难...
dockerBuild缺少未提交的RUN步骤。

mum43rcc

mum43rcc9#

我们在构建docker的过程中也遇到了类似的问题。每个构建的映像都比其他映像大很多。结果发现,我们在映像中包含了tar.gz文件。这些文件中有我们上传到服务器的压缩映像。因此,每个映像都意外地包含了之前的映像。映像大小很快就达到了8gb。
.dockerignore是您的朋友。请确保项目中构建映像所不需要的任何内容都在ignore文件中。

相关问题