前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust 日报】2022-04-01 用于 Rust 应用程序的小而快的 Docker 映像

【Rust 日报】2022-04-01 用于 Rust 应用程序的小而快的 Docker 映像

作者头像
MikeLoveRust
发布2022-04-18 15:37:24
6940
发布2022-04-18 15:37:24
举报
用于 Rust 应用程序的小而快的 Docker 映像

以下步骤将使用 Rocket “hello world” 应用程序作为演示。

Dockerfile 正常来说基本配置将是:

代码语言:javascript
复制
# Dockerfile.plain

ARG BASE_IMAGE=rust:1.52.1-slim-buster

FROM $BASE_IMAGE
WORKDIR app
COPY . .
RUN cargo build --release
CMD ["./target/release/hello"]

然后构建镜像

代码语言:javascript
复制
time docker build -f Dockerfile.plain -t hello:0.1.0 .

我们可以看到生成1.38GB 的镜像,构建时间为12 分钟。

代码语言:javascript
复制
# build
real    12m13.412s
user    0m0.135s
sys     0m0.095s

REPOSITORY    TAG                  IMAGE ID       CREATED          SIZE
hello         0.1.0                ac4e1a72ba05   2 minutes ago    1.38GB
rust          1.52.1-slim-buster   61cb3c65a6ba   3 weeks ago      621MB

接下来使用多阶段构建和 cargo-chef 来使镜像尺寸更小

代码语言:javascript
复制
# Dockerfile.chef

ARG BASE_IMAGE=rust:1.52.1-slim-buster

FROM $BASE_IMAGE as planner
WORKDIR app
RUN cargo install cargo-chef --version 0.1.20
COPY . .
RUN cargo chef prepare  --recipe-path recipe.json

FROM $BASE_IMAGE as cacher
WORKDIR app
RUN cargo install cargo-chef --version 0.1.20
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json

FROM $BASE_IMAGE as builder
WORKDIR app
COPY . .
# Copy over the cached dependencies
COPY --from=cacher /app/target target
COPY --from=cacher $CARGO_HOME $CARGO_HOME
RUN  cargo build --release

FROM $BASE_IMAGE
COPY --from=builder /app/target/release/hello /
CMD ["./hello"]

它会生成628MB的图像大小,最后一次由于缓存的原因构建只需要1 分钟左右。

代码语言:javascript
复制
# first test omitted
# second test
real    19m32.836s
user    0m0.188s
sys     0m0.088s

# third test
real    1m52.982s
user    0m0.060s
sys     0m0.088s

REPOSITORY   TAG    IMAGE ID       CREATED              SIZE
hello        0.1.0  ca1a9e1e5948   About a minute ago   628MB

更可以通过 distroless 或者 scratch 镜像来再加速构建,但是这里如果是 scratch 必须将工具链目标更改为 musl。

scratch:

代码语言:javascript
复制
# Dockerfile.musl

ARG BASE_IMAGE=rust:1.52.1-slim-buster

FROM $BASE_IMAGE as planner
WORKDIR app
RUN cargo install cargo-chef --version 0.1.20
COPY . .
RUN cargo chef prepare  --recipe-path recipe.json

FROM $BASE_IMAGE as cacher
WORKDIR app
RUN cargo install cargo-chef --version 0.1.20
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json

FROM $BASE_IMAGE as builder
WORKDIR app
COPY . .
# Copy over the cached dependencies
COPY --from=cacher /app/target target
COPY --from=cacher $CARGO_HOME $CARGO_HOME
# We need static linking for musl
RUN rustup target add x86_64-unknown-linux-musl
# `cargo build` doesn't work in static linking, need `cargo install`
RUN cargo install --target x86_64-unknown-linux-musl --path .

FROM scratch
COPY --from=builder /usr/local/cargo/bin/hello .
CMD ["./hello"]

结果:

代码语言:javascript
复制
# first test ommitted
# second test
real    9m22.049s
user    0m0.113s
sys     0m0.103s

# third test
real    9m46.035s
user    0m0.120s
sys     0m0.085s

REPOSITORY   TAG    IMAGE ID       CREATED          SIZE
hello        0.1.0  332ce3b4f717   30 seconds ago   8.38MB

distroless:

代码语言:javascript
复制
# Dockerfile.distroless

ARG BASE_IMAGE=rust:1.52.1-slim-buster

FROM $BASE_IMAGE as planner
WORKDIR app
RUN cargo install cargo-chef --version 0.1.20
COPY . .
RUN cargo chef prepare  --recipe-path recipe.json

FROM $BASE_IMAGE as cacher
WORKDIR app
RUN cargo install cargo-chef --version 0.1.20
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json

FROM $BASE_IMAGE as builder
WORKDIR app
COPY . .
# Copy over the cached dependencies
COPY --from=cacher /app/target target
COPY --from=cacher $CARGO_HOME $CARGO_HOME
RUN cargo build --release

FROM gcr.io/distroless/cc-debian10
COPY --from=builder /app/target/release/hello /
CMD ["./hello"]

结果:

代码语言:javascript
复制
# first test ommitted
# second test
real    1m57.033s
user    0m0.045s
sys     0m0.038s

# third test
real    2m12.585s
user    0m0.093s
sys     0m0.096s

REPOSITORY   TAG    IMAGE ID       CREATED          SIZE
hello        0.1.0  118da37bdfe7   25 seconds ago   29MB

以上结果还是非常可观的。

结论 第一次尝试生成 1.38GB 的映像大小,构建时间为 12m。现在我们可以生成一个非常小的图像,并且构建速度非常快。选择权在你手中。如果您对 musl 目标没问题,请使用 scratch 镜像。否则,选择 distroless 。

  • https://azzamsa.com/n/rust-docker/
什么时候不使用 Rust?

Rust 在软件可靠性和性能方面向前迈出了一大步,这直接转化为节省的金钱和时间。Rust 解决了我作为开发人员每天面临的许多问题,例如不变性和良好的抽象。但与所有技术一样,Rust 也有一些缺点并使之不会成为您项目的最佳选择。今天 Sylvain Kerkour 想探讨一下他认为 Rust 的不好用例。

  • https://kerkour.com/why-not-rust
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用于 Rust 应用程序的小而快的 Docker 映像
  • 什么时候不使用 Rust?
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档