如何用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
相关产品推荐
相关产品推荐

