docker 构建使用 rust 项目占用了 /var/lib/docker/tmp 和 /var/lib/docker/overlay2 中超过 30 GB 的空间

问题描述 投票:0回答:1

我在 Archlinux 上,正在为一个 rust 项目执行一个简单的 docker 构建,该项目的

target
目录为 12GB。

由于这个问题,我已将

/var/lib/docker
目录移动到
/data/arch/var/lib/docker
,其中包含:
rsync -avg /var/lib/docker /data/arch/var/lib/
rm -rf /var/lib/docker
ln -s /data/arch/var/lib/docker /var/lib/docker

当构建达到 30GB 以上时,问题仍然存在,这是我在数据分区上拥有的所有可用空间。

/data/arch/var/lib/docker
目录内,
tmp
目录将增长到12GB。然后
overlay2
将至少有 2 个子目录,每个子目录都有一个
diff
目录和
merged
目录,两者都包含一个
app/target
,将包含 12GB。

/data/arch/var/lib/docker
  /tmp -> 12GB
  /overlay2
    /dirXXX1
      /merged/app/target -> 12GB
      /diff/app/target -> 12GB
    /dirXXX2
      /merged/app/target -> 12GB
      /diff/app/target -> 12GB

但是,dirXXX2 目录实际上并未达到 24GB,因为构建将耗尽空间并终止整个进程。

这对我来说似乎太过分了,想知道是否可以在这里重新配置一些东西。

更新:

我还添加了

/etc/docker/daemon.json

{ 
  "storage-driver": "devicemapper",
  "log-driver": "local",
  "log-opts": {
      "max-size": "100m",
      "max-file": "3"
}

Dockerfile:

FROM rust:1.72.0

WORKDIR /app

RUN apt update && apt install lld clang -y

COPY . .

RUN cargo build --release

ENTRYPOINT ["./target/release/zero2prod"]
docker rust target arch
1个回答
0
投票

您当前的 docker 镜像不仅包含最终构建,还包含导致该构建的所有源文件,而镜像中不需要这些文件

我会考虑使用多阶段构建来保持图像尺寸更小

例如,你可以这样做:

FROM rust:1.72.0 as builder
WORKDIR /app
RUN apt update && apt install lld clang -y
COPY . .
RUN cargo install --path .
RUN cargo build --release

FROM debian:buster-slim
RUN apt-get update & apt-get install -y extra-runtime-dependencies & rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/cargo/bin/zero2prod /usr/local/bin/zero2prod
CMD ["zero2prod"]

(注意:我还没有测试过这个,但它应该可以给你一个大概的想法)

参考:https://www.docker.com/blog/simplify-your-deployments-using-the-rust-official-image/

© www.soinside.com 2019 - 2024. All rights reserved.