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 .
结合场景再看三个关注点
- 依赖缓存否则每次全量编译
- musl/静态 可选换 scratch/distroless
- SIGTERM 传到进程 支持优雅关闭
工程实践
- 固定 base digest
- 非 root
- 只读根文件系统(若可行)
- 健康检查与资源 limit
- CI 缓存 sccache/cargo
本节总结
- 多阶段减小攻击面与体积
- 编译缓存是关键
- 与配置/信号协作
自测题
- 为何 runtime 不直接用 rust 镜像?
- 静态链接的取舍?
参考答案
- 体积与攻击面。
- 易 scratch 部署,但调试/glibc 特性/体积策略需评估。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Docker multi-stage | 官方 | 多阶段 |
| cargo-chef | 生态 | 依赖缓存 |