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

多阶段Docker构建:如何复制SQLite3等工具到Distroless镜像?

问题解答

1. SQLite3、curl、Imagemagick的复制路径

distroless base镜像仅包含最基础的系统组件,没有预装这些工具的二进制文件和依赖库,需要从builder阶段复制以下内容:

SQLite3

  • 二进制文件:/usr/bin/sqlite3
  • 核心依赖库:/usr/lib/aarch64-linux-gnu/libsqlite3.so.0(可通过ldd /usr/bin/sqlite3查看完整依赖列表)
    COPY命令示例:
COPY --from=builder /usr/bin/sqlite3 /usr/bin/sqlite3
COPY --from=builder /usr/lib/aarch64-linux-gnu/libsqlite3.so.0 /usr/lib/aarch64-linux-gnu/libsqlite3.so.0

curl

  • 二进制文件:/usr/bin/curl
  • 核心依赖库:/usr/lib/aarch64-linux-gnu/libcurl.so.4、/usr/lib/aarch64-linux-gnu/libssl.so.1.1、/usr/lib/aarch64-linux-gnu/libcrypto.so.1.1
    COPY命令示例:
COPY --from=builder /usr/bin/curl /usr/bin/curl
COPY --from=builder /usr/lib/aarch64-linux-gnu/libcurl.so.4 /usr/lib/aarch64-linux-gnu/libcurl.so.4
COPY --from=builder /usr/lib/aarch64-linux-gnu/libssl.so.1.1 /usr/lib/aarch64-linux-gnu/libssl.so.1.1
COPY --from=builder /usr/lib/aarch64-linux-gnu/libcrypto.so.1.1 /usr/lib/aarch64-linux-gnu/libcrypto.so.1.1

Imagemagick

Imagemagick依赖较多,至少需要复制常用二进制、核心库及配置文件:

  • 二进制文件:/usr/bin/convert、/usr/bin/magick
  • 核心依赖库:/usr/lib/aarch64-linux-gnu/libMagickCore-7.Q16HDRI.so.6、/usr/lib/aarch64-linux-gnu/libMagickWand-7.Q16HDRI.so.6
  • 配置文件:/etc/ImageMagick-7/
    COPY命令示例:
COPY --from=builder /usr/bin/convert /usr/bin/convert
COPY --from=builder /usr/bin/magick /usr/bin/magick
COPY --from=builder /usr/lib/aarch64-linux-gnu/libMagickCore-7.Q16HDRI.so.6 /usr/lib/aarch64-linux-gnu/libMagickCore-7.Q16HDRI.so.6
COPY --from=builder /usr/lib/aarch64-linux-gnu/libMagickWand-7.Q16HDRI.so.6 /usr/lib/aarch64-linux-gnu/libMagickWand-7.Q16HDRI.so.6
COPY --from=builder /etc/ImageMagick-7/ /etc/ImageMagick-7/

如果依赖库较多,可通过dpkg -L <package-name>查看软件包安装的所有文件,批量复制但需排除冗余内容。

2. 如何确定应用的存放路径

在builder阶段的容器中执行以下命令即可查找:

  • 查找二进制文件路径:which <command>(例如which sqlite3会输出/usr/bin/sqlite3)
  • 查看依赖库路径:ldd <binary-path>(例如ldd /usr/bin/sqlite3列出所有依赖库的路径)
  • 查看软件包完整文件列表:dpkg -L <package-name>(例如dpkg -L imagemagick列出该包所有安装文件的路径)

3. 其他缩小Docker镜像体积的方法

  • 选用轻量基础镜像:比如用alpine替代debian-slim(注意alpine使用musl libc,部分软件需适配),或使用distroless系列针对性镜像(如gcr.io/distroless/nodejs,已包含Node.js运行时)
  • 合并RUN命令并清理缓存:将多个RUN命令合并,同时清理apt缓存避免残留,例如:
    RUN apt update && apt install -y curl unzip sqlite3 imagemagick && rm -rf /var/lib/apt/lists/*
    
  • 使用.dockerignore文件:排除项目中不需要的文件(如.git、本地node_modules、日志、测试文件等)
  • 仅复制必要文件:多阶段构建时只复制运行时所需内容,避免复制源码、构建工具等冗余文件
  • 压缩二进制文件:用upx工具压缩二进制(注意部分二进制不支持压缩,需测试)
  • 构建特定架构镜像:使用docker buildx构建目标架构的镜像,避免多架构冗余内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:46:18