为什么 Rust docker 镜像这么大

Dol*_*hin 4 rust docker

我正在将 Rust 应用程序打包到 Docker 映像中以部署到我的服务器。我发现 rust docker 镜像大小超过 1GB(比使用java和的任何其他应用程序都大python)。为什么 Rust docker 镜像这么大?我检查了图层,发现该cargo build命令占用了超过 400MB 的空间。

FROM rust:1.54

LABEL maintainer="jiangtingqiang@gmail.com" 

ENV ROCKET_ADDRESS=0.0.0.0
ENV ROCKET_PORT=11014 

WORKDIR /app
COPY . .

RUN rustup default stable
RUN cargo build

CMD ["cargo", "run"]
Run Code Online (Sandbox Code Playgroud)

是否可以让 Rust docker 镜像变小?

Sve*_*rev 21

Rust 镜像绝对不是 1GB。从 Dockerhub 中我们可以看到镜像要小得多。您的映像为 1GB,因为它包含应用程序运行所不需要的所有中间构建工件 - 只需检查targetPC 上文件夹的大小

铁锈图像尺寸

+---------------+----------------+------------------+
|    Digest     |     OS/ARCH    |  Compressed Size |
+---------------+----------------+------------------+
| 99d3d924303a  | linux/386      | 265.43 MB        |
| 852ba83a6e49  | linux/amd64    | 196.74 MB        |
| 6eb0fe2709a2  | linux/arm/v7   | 256.59 MB        |
| 2a218d86ec85  | linux/arm64/v8 | 280.22 MB        |
+---------------+----------------+------------------+
Run Code Online (Sandbox Code Playgroud)

rust docker 映像包含构建应用程序所需的编译器,但不必将其与最终映像打包在一起。您也不必打包构建过程生成的所有临时工件。

解决方案

为了减少最终的生产映像,您必须使用多阶段 docker 构建:

  1. 第一阶段构建图像
  2. 第二阶段丢弃所有不相关的内容并仅获取构建的应用程序:
# Build stage
FROM rust:1.54 as builder
WORKDIR /app
ADD . /app
RUN cargo build --release

# Prod stage
FROM gcr.io/distroless/cc
COPY --from=builder /app/target/release/app-name /
CMD ["./app-name"]

Run Code Online (Sandbox Code Playgroud)

  • @Herohtar 不,他正在使用“cargo run”,它在运行调试构建之前构建应用程序并生成大量构建工件,这些工件根本不需要,但会占用空间。rustc 和 Cargo 都不是。仅包含必要的应用程序二进制文件的无发行版映像只有几兆字节! (2认同)

归档时间:

查看次数:

2521 次

最近记录:

4 年,10 月 前