我在ubuntu机器上有一个大约2GB以上的软件包。我已经从docker文件创建了一个docker镜像,大小约为86MB。现在,我通过使用copy命令更新docker文件来创建另一个映像,该命令将在构建新的docker映像的同时将ubuntu机器中的软件包复制到docker映像。
现在,我看到docker映像大小约为2GB,因为docker映像也包含该软件包。我想知道这种docker现象是否有助于我们在制作为docker镜像后减小软件包的大小。
我希望以这种方式创建docker映像,它还应该包含大约2GB的软件包,但是我不希望docker映像的大小超过200MB。
关于, 卡尔提克
答案 0 :(得分:3)
Docker不会为您压缩图像的数据。希望对任意安装的软件包进行10倍压缩,无论是Docker还是其他方式,都相当乐观。
尽管Docker使用了一些聪明而复杂的内核机制,但在大多数情况下,容器中的文件会以奇怪的文件系统布局映射到磁盘上的普通文件。如果要在映像中安装2 GB的软件包,则需要2 GB的本地磁盘空间。有一些共享数据的机制可以帮助减少总体磁盘使用率(如果您基于该映像运行10个容器,它们将共享2 GB基本映像,并且不使用额外的磁盘空间),但是没有内置压缩。
进一步的注意:在Dockerfile中采取措施以某种形式使用空间后,该空间将被永久使用。 Dockerfile中的每一行都创建一个新的“层”或单独的映像,该映像记录了上一层的更改。如果您尝试安装不在某种版本库中的软件包,那么除非您可以对其使用多阶段构建,否则您将无法使用其在映像中的空间利用率:
FROM ubuntu:18.04
COPY package.deb .
# At this point there is a layer containing the .deb file and
# it uses space in the final image.
RUN dpkg --install package.deb && rm package.deb
# The file isn't "in the image", but the image remembers adding it
# and then removing it, so it still uses space.
答案 1 :(得分:0)
正如David所提到的,不可能使用使用叠加或类似分层FS表示形式的docker。
但是有一种解决方法可以保持图像较小(但是容器的尺寸会很大!),但这会增加从docker容器启动应用程序的时间,也可能会增加一些复杂性。您传递给应用程序的参数。减小尺寸的一种可能方法:
通过使用gzip / 7zip / bzip2或您选择的任何压缩器压缩程序包文件进行检查-全部查看输出文件的大小是否减小。
如果压缩得不够