当前位置: 首页 > 知识库问答 >
问题:

为什么生锈的docker图像如此巨大

宰父衡
2023-03-14

我正在将一个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"]

是否可以缩小rust docker的图像?

共有1个答案

周育
2023-03-14

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

+---------------+----------------+------------------+
|    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映像包含构建应用程序所需的编译器,但您不需要;不必将其与最终映像打包。您也不必打包构建过程生成的所有临时工件。

为了减少最终的生产映像,您必须使用多阶段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"]

 类似资料:
  • 问题内容: 我通过Fedora的Dockerfile创建了一个简单的映像(最初为320 MB)。 添加了Nano(这个1MB大小的微型编辑器),图像的大小已增加到530 MB。我在此基础上添加了Git(30-ish MB),然后将图像大小的火箭提高到830 MB。 那不是疯了吗? 我试图导出和导入容器以删除历史记录/中间图像。这项工作最多可节省25 MB,现在我的图像大小为804 MB。我也尝试过

  • 问题内容: 用PIL(1.1.7)创建的JPEG图像质量很差。这是一个例子: 输入:https : //s23.postimg.cc/8bks3x5p7/cover_1.jpg 输出:https : //s23.postimg.cc/68ey9zva3/cover_2.jpg 输出图像是使用以下代码创建的: 红色文字看起来真的很糟糕。使用GIMP或Photoshop保存图像甚至不能接近PIL所产生

  • 我从Fedora通过Dockerfile制作了一个简单的图像(最初为320 MB)。 添加了Nano(这个1MB大小的微小编辑器),图像的大小上升到了530MB。我在上面添加了Git(大约30 MB),然后我的图像大小的sky-rockets达到了830 MB。 这不是疯了吗? 我已经尝试导出和导入容器来删除历史/中间图像。这一努力节省了25 MB,现在我的图像大小是804 MB。我也尝试在一个上

  • 我有一个非常简单的dockerfile 然后使用 根据我对Docker的了解,当我键入时,它应该只在下显示;但是这不是发生的事情。相反,我看到: 为什么会出现基础图像?例如,我从中提取的存储库 但这并没有出现。那么在这种情况下,为什么会有基础图像呢?

  • 我是Docker的新手,正在尝试准确理解Docker映像是什么。Docker映像的每个定义都使用术语“层”,但似乎没有定义层的含义。 从Docker官方文件: 我们已经看到Docker图像是只读模板,从中启动Docker容器。每个图像由一系列层组成。Docker利用union文件系统将这些层合并到单个图像中。Union文件系统允许透明地覆盖单独文件系统(称为分支)的文件和目录,形成单个连贯的文件系

  • 我对Docker是全新的,我正在努力理解Docker形象到底是什么。Docker图像的每个定义都使用术语“层”,但似乎没有定义层的含义。