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

Docker精简镜像中Rust程序DNS解析失效,求排查缺失文件方案

Rust程序精简Docker镜像后DNS查询失效的问题解决

问题背景

我有一个需要执行DNS查询的Rust程序,使用以下Dockerfile构建镜像时运行完全正常:

FROM rust:1.63.0-bullseye AS build
WORKDIR /app
COPY . .
RUN cargo build --release
EXPOSE 8080

ENTRYPOINT ["/app/target/release/router"]

尝试用下面的Dockerfile构建更精简的镜像后,程序的DNS查询功能失效了:

FROM rust:1.63.0-bullseye AS build
WORKDIR /app
COPY . .
RUN cargo build --release
RUN mkdir -p /app/lib
RUN cp -LR $(ldd ./target/release/router | grep "=" | cut -d ' ' -f 3) /app/lib

FROM scratch AS websocket-router-rust
WORKDIR /app
COPY --from=build /app/lib /app/lib
COPY --from=build /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
COPY --from=build /app/target/release/router /app/router
ENV LD_LIBRARY_PATH=/app/lib
EXPOSE 8080

ENTRYPOINT ["/app/router"]

问题根源

核心问题是**ldd工具不会列出libnss系列的共享库**,而这些库是Linux系统中处理名称服务(包括DNS解析)的关键依赖。Rust程序进行DNS查询时必须调用这些库,但精简后的scratch镜像里没有复制它们,导致DNS功能无法正常工作。

解决方法

需要从构建阶段的rust:1.63.0-bullseye镜像中复制libnss相关的库文件到scratch镜像中。你可以通过文件访问追踪工具(比如strace)精准定位程序运行时需要的所有文件,再逐一复制。

常见需要补充的依赖文件包括:

  • /lib/x86_64-linux-gnu/libnss_dns.so.2
  • /lib/x86_64-linux-gnu/libnss_files.so.2
  • /lib/x86_64-linux-gnu/libresolv.so.2

修改后的Dockerfile示例:

FROM rust:1.63.0-bullseye AS build
WORKDIR /app
COPY . .
RUN cargo build --release
RUN mkdir -p /app/lib
# 复制ldd列出的常规依赖
RUN cp -LR $(ldd ./target/release/router | grep "=" | cut -d ' ' -f 3) /app/lib
# 补充复制DNS解析所需的libnss库
RUN cp /lib/x86_64-linux-gnu/libnss_dns.so.2 /app/lib/
RUN cp /lib/x86_64-linux-gnu/libnss_files.so.2 /app/lib/
RUN cp /lib/x86_64-linux-gnu/libresolv.so.2 /app/lib/

FROM scratch AS websocket-router-rust
WORKDIR /app
COPY --from=build /app/lib /app/lib
COPY --from=build /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
COPY --from=build /app/target/release/router /app/router
ENV LD_LIBRARY_PATH=/app/lib
EXPOSE 8080

ENTRYPOINT ["/app/router"]

补充说明

用strace这类工具追踪程序运行时的文件访问(比如执行strace ./router 2>&1 | grep open),可以准确找出所有缺失的依赖文件。这种方法虽然会让Dockerfile稍微复杂一些,但能有效将镜像大小压缩到30MB以下,同时保证程序功能完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:40:32