服务器空间占满排Bug日志:docker Build Cache 清理
2024-10-22 14:52:45

服务器空间占满排Bug日志:docker Build Cache 清理

排查过程

我购买的服务器有30G的磁盘空间,但是在某天登录服务器发现磁盘满了,我寻思没有存放大量占空间的文件。然后用du命令和df命令查看一下。

用df查看系统磁盘的空间情况:

1
2
3
4
5
6
7
8
9
10
[root@youtmd ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 894M 0 894M 0% /dev
tmpfs 909M 24K 909M 1% /dev/shm
tmpfs 909M 89M 821M 10% /run
tmpfs 909M 0 909M 0% /sys/fs/cgroup
/dev/vda1 30G 30G 0 100% /
overlay 30G 30G 0 100% /var/lib/docker/overlay2/0bd70441e338de4afbece39b51d954f722cee372ff6f133e35fb56c18e254221/merged
overlay 30G 30G 0 100% /var/lib/docker/overlay2/39c5cd31d0a03429d2cdcffdeb23e8987cc571fcb0f39e4e58fe8720f4c63195/merged
tmpfs 182M 0 182M 0% /run/user/0

用du命令查看逐个文件夹的体积:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@youtmd /]# du -h -d 1
261M ./root
52K ./tmp
0 ./dev
16K ./lost+found
108K ./log
5.0G ./www
4.0K ./media
0 ./sys
24K ./home
27M ./etc
4.0K ./data
89M ./run
du: cannot access './proc/1220704/task/1220704/fd/4': No such file or directory
du: cannot access './proc/1220704/task/1220704/fdinfo/4': No such file or directory
du: cannot access './proc/1220704/fd/3': No such file or directory
du: cannot access './proc/1220704/fdinfo/3': No such file or directory
0 ./proc
303M ./boot
22G ./var
3.3G ./usr
4.0K ./mnt
4.2M ./opt
4.0K ./srv
30G .

可以看出上面的/var文件夹占空间较大,可我没有存放什么文件到该文件夹。

后来想了一下,有可能是docker。

Docker占空间的无非是:

  1. 镜像
  2. 容器
  3. 构建过程产生的构建日志Build Cache

Docker镜像:

1
2
3
4
5
6
7
8
9
[root@youtmd /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
www-myblog latest 0307164d754b 25 hours ago 336MB
myblog latest 17b3ffd5631d 4 days ago 329MB
depoly-phpfpm latest 29847cdc4641 2 months ago 511MB
nginx latest eea7b3dcba7e 2 months ago 187MB
ghcr.io/getzola/zola v0.17.2 a37168718925 7 months ago 47.4MB
ghcr.io/getzola/zola v0.17.1 364fea1e8204 7 months ago 47.3MB
ghcr.io/getzola/zola v0.15.1 8bc5561f3d57 22 months ago 50.6MB

单凭查看,可以看到docker镜像也不占太大空间。

但是用docker system df命令查看后:

1
2
3
4
5
6
[root@youtmd var]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 7 5 1.135GB 744.7MB (65%)
Containers 72 2 697.4MB 697.4MB (99%)
Local Volumes 0 0 0B 0B
Build Cache 147 0 12.1GB 12.1GB

可以发现Build Cache足足有12.1GB,因此我需要处理掉Build Cache。但什么是Build Cache呢?

关于 docker Build Cache

Docker 构建缓存(Docker Build Cache)是 Docker 构建过程中的一个重要概念,它可以加速 Docker 镜像的构建过程。构建缓存允许 Docker 在多次构建相似的镜像时,重复使用之前构建的层(layers),而不是每次都从头开始构建整个镜像。

Docker 镜像是由一系列层组成的,每个层代表了镜像中的文件和文件系统的快照。在构建一个新的镜像时,Docker 使用之前构建过的层来加速构建过程。

如果你对已有的 Dockerfile 进行了一些修改,而这些修改只影响了 Dockerfile 的后面一部分,那么构建缓存可以让 Docker 重用之前构建的层,只重新构建受影响的部分,从而显著减少构建时间。

Docker 构建缓存的工作方式如下:

  1. 当你运行 docker build 命令来构建一个镜像时,Docker 会逐步执行 Dockerfile 中的每个命令,每个命令都生成一个新的层。

  2. Docker 会检查每个命令生成的层是否在构建缓存中已经存在。如果存在,Docker 将重用该层,而不是重新构建。

  3. 如果某个命令之后的所有命令都没有发生更改,那么 Docker 会重用之前构建的层,直到遇到发生更改的命令。

  4. 当 Docker 构建过程中的某个命令发生更改,之后的命令以及层都会重新构建,从而确保镜像的正确性。

你可以通过使用 --no-cache 选项来禁用构建缓存,强制 Docker 在每次构建时都从头开始构建镜像。

因为有时构建缓存可能会导致不正确的结果,特别是当 Dockerfile 中的命令依赖于外部因素或者缓存不一致时,因此在某些情况下可能需要禁用缓存以确保镜像的正确性。

1
docker build --no-cache -t 镜像名称:版本号 .

解决问题

一键清理 Build Cache 缓存命令:docker builder prune

1
2
3
4
5
6
7
8
9
10
[root@youtmd /]# docker builder prune
WARNING! This will remove all dangling build cache. Are you sure you want to continue? [y/N] y
ID RECLAIMABLE SIZE LAST ACCESSED
yd12c76cca83sw9unp0qsu4wh* true 0B 2 months ago
ieu32wpuvshcdbjfbm8480v6r* true 0B 25 hours ago
q40jvchqq7ck1m90n5u5369ls* true 149.8MB 4 days ago
4geyeu6k34fojqdh7e22vd48j* true 152.9MB 25 hours ago
.
.
.

成功解决docker缓存空间占用问题

1
2
3
4
5
6
7
8
9
10
[root@youtmd /]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 894M 0 894M 0% /dev
tmpfs 909M 24K 909M 1% /dev/shm
tmpfs 909M 604K 908M 1% /run
tmpfs 909M 0 909M 0% /sys/fs/cgroup
/dev/vda1 30G 20G 9.0G 69% /
overlay 30G 20G 9.0G 69% /var/lib/docker/overlay2/0bd70441e338de4afbece39b51d954f722cee372ff6f133e35fb56c18e254221/merged
overlay 30G 20G 9.0G 69% /var/lib/docker/overlay2/39c5cd31d0a03429d2cdcffdeb23e8987cc571fcb0f39e4e58fe8720f4c63195/merged
tmpfs 182M 0 182M 0% /run/user/0

补充:

还有可能是已经废弃的容器占用的系统空间,可以使用:

1
docker system prune

进行清理