使用 Docker 多阶段构建来复制使用 apt 安装的包的正确方法是什么?

问题描述 投票:0回答:1

我的 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
就足够了?如果我必须全部复制,似乎很容易损坏。

docker ffmpeg apt
1个回答
0
投票

除非您明确知道包中的各个文件是什么、它们的作用以及为什么需要它们,否则您无法真正获得比

apt-get install --no-install-recommends
为您提供的安装更小的安装。对于多阶段构建,没有可靠的技巧可以仅安装部分包。

查看 Debian 软件包页面,发现

ffmpeg
该软件包本身只有大约 2 MB。手册页通常会被隐藏,但您可能需要
/usr/share/ffmpeg
中的六个文件。更大的问题是
ffmpeg
依赖于 9 个不同的共享库包,如果你不安装它们,那么二进制文件可能不会运行。
libavcodec59
本身较大(~14 MB)并且有很多依赖项;我猜其中一些是巨大图像尺寸的来源。

多阶段构建可以提供帮助的情况是,如果您需要某种工具作为构建映像的一部分,但不需要该工具来实际运行它。在 Node 上下文中,如果您有带有 C 扩展的包,您可能需要 C 编译器,但仅用于运行

npm install
。 (这在 Python 中更为常见。)在像 Go 这样的编译语言中,您不需要编译器来运行程序,因此您可以使用第一个构建阶段来编译应用程序,然后使用仅复制应用程序的第二阶段构建的应用程序,但不是创建它的工具。由于在这种情况下构建系统在您的控制之下,因此您可能知道所有必需的文件是什么,并且可以确保您需要的部分出现在最终图像中。

© www.soinside.com 2019 - 2024. All rights reserved.