为什么rust docker的图像这么大?



我正在打包一个rust应用程序到一个docker镜像部署到我的服务器。我发现rust docker映像大小超过1GB(比使用javapython的任何其他应用程序都大)。为什么锈码头的图像如此巨大?我检查了图层,发现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"]

是否有可能使rust docker图像更小?

rust图像绝对不是1GB。从Dockerhub我们可以看到图像要小得多。您的映像是1GB,因为它包含了所有中间构建构件,这些构件对于应用程序的功能是不必要的-只需检查PC上target文件夹的大小

锈图尺寸:

+---------------+----------------+------------------+
|    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        |
+---------------+----------------+------------------+

rust docker镜像包含编译器,你需要它来构建你的应用程序,但你不需要把它打包到你的最终镜像中。您也不必打包所有由构建过程生成的临时构件。

解决方案为了减少final在生产镜像中,你必须使用多级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"]

最新更新