我在 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 镜像不仅包含最终构建,还包含导致该构建的所有源文件,而镜像中不需要这些文件
我会考虑使用多阶段构建来保持图像尺寸更小
例如,你可以这样做:
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/