Rust Docker 部署

多阶段构建缩小镜像、缓存依赖编译、运行非 root 与基础安全实践。

#type / howto #status / growing #tech / dev #resource / rust

[!info] 关联笔记

Rust Docker 部署

这个概念为什么出现

Rust 编译重、产物可静态/动态链接差异大。
容器部署需要缓存依赖层小运行镜像

[!abstract] 一句话理解 多阶段 Dockerfile:builder 编译 release 二进制,runtime 只拷贝产物与必要证书,以非 root 运行并配置信号感知。

最小可运行示例

场景:多阶段构建骨架

# 业务意图:构建最小可运行镜像形状。
# 教学点:cargo 缓存技巧需结合 cargo-chef 等;此处给最小概念。

# syntax=docker/dockerfile:1
FROM rust:1.83 as builder
WORKDIR /app
COPY . .
RUN cargo build --release

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/my_app /usr/local/bin/my_app
USER 65534:65534
ENTRYPOINT ["/usr/local/bin/my_app"]

构建:docker build -t my_app .

结合场景再看三个关注点

  1. 依赖缓存否则每次全量编译
  2. musl/静态 可选换 scratch/distroless
  3. SIGTERM 传到进程 支持优雅关闭

工程实践

  1. 固定 base digest
  2. 非 root
  3. 只读根文件系统(若可行)
  4. 健康检查与资源 limit
  5. CI 缓存 sccache/cargo

本节总结

  • 多阶段减小攻击面与体积
  • 编译缓存是关键
  • 与配置/信号协作

自测题

  1. 为何 runtime 不直接用 rust 镜像?
  2. 静态链接的取舍?
参考答案
  1. 体积与攻击面。
  2. 易 scratch 部署,但调试/glibc 特性/体积策略需评估。

延伸阅读与资料来源

资料类型支撑内容
Docker multi-stage官方多阶段
cargo-chef生态依赖缓存
创建于 2026/7/15 更新于 2026/7/15