我的 dockerfile 中有
apt-get -y install ffmpeg --no-install-recommends
,它占用了图像大小一半以上(500MB)。我在某处读到可以尝试使用 Docker 多阶段构建来减小文件大小。
我应该做这样的事情吗:
FROM node:20.9.0-slim
RUN apt-get -y update \
&& apt-get -y install ffmpeg --no-install-recommends \
&& apt-get clean
FROM node:20.9.0-slim
COPY --from=0 /usr/bin/ffmpeg
COPY --from=0 /usr/bin/ffplay
COPY --from=0 /usr/share/ffmpeg/ffprobe.xsd
COPY --from=0 /usr/share/lintian/overrides/ffmpeg
我运行
dpkg -L ffmpeg
看到 ffmpeg 有大约 30 个文件。我应该复制所有文件还是仅仅 /usr/bin/ffmpeg
就足够了?如果我必须全部复制,似乎很容易损坏。
除非您明确知道包中的各个文件是什么、它们的作用以及为什么需要它们,否则您无法真正获得比
apt-get install --no-install-recommends
为您提供的安装更小的安装。对于多阶段构建,没有可靠的技巧可以仅安装部分包。
ffmpeg
该软件包本身只有大约 2 MB。手册页通常会被隐藏,但您可能需要 /usr/share/ffmpeg
中的六个文件。更大的问题是 ffmpeg
依赖于 9 个不同的共享库包,如果你不安装它们,那么二进制文件可能不会运行。 libavcodec59
本身较大(~14 MB)并且有很多依赖项;我猜其中一些是巨大图像尺寸的来源。
多阶段构建可以提供帮助的情况是,如果您需要某种工具作为构建映像的一部分,但不需要该工具来实际运行它。在 Node 上下文中,如果您有带有 C 扩展的包,您可能需要 C 编译器,但仅用于运行
npm install
。 (这在 Python 中更为常见。)在像 Go 这样的编译语言中,您不需要编译器来运行程序,因此您可以使用第一个构建阶段来编译应用程序,然后使用仅复制应用程序的第二阶段构建的应用程序,但不是创建它的工具。由于在这种情况下构建系统在您的控制之下,因此您可能知道所有必需的文件是什么,并且可以确保您需要的部分出现在最终图像中。