You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Docker多阶段构建复制apt安装的FFmpeg以减小镜像体积?

用Docker多阶段构建缩减FFmpeg镜像体积的正确姿势

你当前写的Dockerfile不完整也没法正常运行,原因很简单:FFmpeg不是单二进制文件,它依赖大量动态链接库,只复制几个可执行文件和零散配置,到第二阶段的镜像里根本跑不起来。

要不要复制dpkg -L ffmpeg列出的所有文件?

不需要全部复制,但只复制/usr/bin/ffmpeg肯定不行。dpkg -L列出的文件里包含了文档、lintian配置、示例脚本这些完全没用的内容,真正需要的只有FFmpeg可执行文件和它依赖的动态链接库。

正确的多阶段构建方式

核心思路是:在第一阶段完整安装FFmpeg,然后把运行必需的文件复制到第二阶段的干净镜像里,抛弃所有安装过程产生的垃圾和无用文件。

步骤1:找出FFmpeg的依赖库

在第一阶段的镜像里执行ldd /usr/bin/ffmpeg,会列出所有它依赖的动态库路径,比如:

libavcodec.so.60 => /usr/lib/x86_64-linux-gnu/libavcodec.so.60
libavformat.so.60 => /usr/lib/x86_64-linux-gnu/libavformat.so.60
libavutil.so.58 => /usr/lib/x86_64-linux-gnu/libavutil.so.58
libswscale.so.7 => /usr/lib/x86_64-linux-gnu/libswscale.so.7
...

这些就是我们需要复制的核心依赖。

示例Dockerfile

# 第一阶段:临时镜像,用于安装FFmpeg并获取所需文件
FROM node:20.9.0-slim AS ffmpeg-builder

# 安装FFmpeg并清理缓存,减少临时文件体积
RUN apt-get update \
    && apt-get install -y --no-install-recommends ffmpeg \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 第二阶段:最终运行镜像,仅保留必要文件
FROM node:20.9.0-slim

# 复制FFmpeg主可执行文件,如果需要ffprobe也一起复制
COPY --from=ffmpeg-builder /usr/bin/ffmpeg /usr/bin/ffmpeg
COPY --from=ffmpeg-builder /usr/bin/ffprobe /usr/bin/ffprobe

# 复制依赖的动态库(根据ldd输出补充完整)
RUN mkdir -p /usr/lib/x86_64-linux-gnu/
COPY --from=ffmpeg-builder /usr/lib/x86_64-linux-gnu/libavcodec.so* /usr/lib/x86_64-linux-gnu/
COPY --from=ffmpeg-builder /usr/lib/x86_64-linux-gnu/libavformat.so* /usr/lib/x86_64-linux-gnu/
COPY --from=ffmpeg-builder /usr/lib/x86_64-linux-gnu/libavutil.so* /usr/lib/x86_64-linux-gnu/
COPY --from=ffmpeg-builder /usr/lib/x86_64-linux-gnu/libswscale.so* /usr/lib/x86_64-linux-gnu/
COPY --from=ffmpeg-builder /usr/lib/x86_64-linux-gnu/libavfilter.so* /usr/lib/x86_64-linux-gnu/
COPY --from=ffmpeg-builder /usr/lib/x86_64-linux-gnu/libswresample.so* /usr/lib/x86_64-linux-gnu/

# 验证FFmpeg是否能正常运行
RUN ffmpeg -version

额外优化建议

  • 如果不需要ffprobe、ffplay这些工具,可以只复制/usr/bin/ffmpeg
  • 可以用官方FFmpeg镜像(比如jrottenberg/ffmpeg:latest)作为构建阶段,避免在node镜像里安装FFmpeg的依赖,可能会进一步缩小体积(注意匹配架构,比如amd64/arm64)
  • 复制库文件时用通配符*.so*可以同时复制主文件和版本符号链接,避免版本匹配问题

内容的提问来源于stack exchange,提问作者Leo Jiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:33:45