簡體   English   中英

為什么長時間運行的 docker 實例會填滿我的磁盤空間?

[英]Why does a long running docker instance fill up my disk space?

當我啟動新的 Ubuntu 機器 (EC2) 並下載一個運行了很長時間的 docker 映像時,幾周后磁盤已滿。 我該如何防止這種情況發生?

我在網上找到的所有內容都在談論運行 docker 修剪,但我的問題與大量雜散的 docker 圖像或卷無關。 此 EC2 實例下載單個映像並僅啟動一次(並使其永遠運行,這是一個 CI 運行器)。

這里有一些線索:

  • 主機和 docker 鏡像都是 Ubuntu 20.04
  • 我的 EC2 實例有一個 10 GB 的卷
  • 當我docker pull取圖像時,它只有 2.5 GB(它是 ubuntu 最小圖像)
  • 引導腳本使用以下命令啟動 docker:

docker run -it -d --rm --shm-size=2gb --env --user root --name running-docker-ci ghcr.io/secret/docker-ci:latest start

這是我做過的診斷:

$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/root       10098432 10082048         0 100% /
devtmpfs         8192212        0   8192212   0% /dev
tmpfs            8198028        0   8198028   0% /dev/shm
tmpfs            1639608   164876   1474732  11% /run
tmpfs               5120        0      5120   0% /run/lock
tmpfs            8198028        0   8198028   0% /sys/fs/cgroup
/dev/loop0         34176    34176         0 100% /snap/amazon-ssm-agent/3552
/dev/loop1         56832    56832         0 100% /snap/core18/1988
/dev/loop4         33152    33152         0 100% /snap/snapd/11588
/dev/loop5         56832    56832         0 100% /snap/core18/1997
/dev/loop6         72192    72192         0 100% /snap/lxd/19647
/dev/loop7         69248    69248         0 100% /snap/lxd/20326
/dev/loop2         32896    32896         0 100% /snap/snapd/11841
tmpfs            1639604        0   1639604   0% /run/user/1000

並且運行du很多,這使我成為我最大的文件夾:

/var/lib/docker$ sudo du -s * | sort -nr | head -50
13842100    overlay2
14888   image
128 containers
72  buildkit
56  network
28  volumes
20  plugins
20  builder
4   trust
4   tmp
4   swarm
4   runtimes

有什么幫助嗎? 我難住了。


添加更多詳細信息:

larsks 建議可能這是在容器內。 它似乎不是。 我沒有運行任何生成文件的東西。 奇怪的是,我注意到df顯示overlay文件系統使用了 8 個演出:

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
overlay          8065444 8049060         0 100% /
tmpfs              65536       0     65536   0% /dev
tmpfs            8198028       0   8198028   0% /sys/fs/cgroup
shm              2097152      16   2097136   1% /dev/shm
/dev/root        8065444 8049060         0 100% /etc/hosts
tmpfs            8198028       0   8198028   0% /proc/acpi
tmpfs            8198028       0   8198028   0% /proc/scsi
tmpfs            8198028       0   8198028   0% /sys/firmware

但是當在目錄樹上做du時,它不會加起來接近 8 個演出。 我從正在運行的容器內的文件系統的根目錄運行它:

$ sudo du -s * | sort -nr | head -50

3945724 home
1094712 usr
254652  opt
151984  var
3080    etc
252     run
192     tmp
24      root
16      dev
4       srv
4       mnt
4       media
4       boot
0       sys
0       sbin
0       proc
0       libx32
0       lib64
0       lib32
0       lib
0       bin

OverlayFS 的部分工作原理似乎是刪除操作並不總是釋放文件系統中的空間。 文檔

  • 刪除文件和目錄:

當在容器中刪除文件時,會在容器(上層目錄)中創建一個空白文件。 鏡像層(lowerdir)中文件的版本不會被刪除(因為lowerdir是只讀的)。 但是,whiteout 文件阻止它對容器可用。

當在容器中刪除目錄時,會在容器中創建一個不透明的目錄(上層目錄)。 這與 whiteout 文件的工作方式相同,並有效地防止目錄被訪問,即使它仍然存在於映像 (lowerdir) 中。

在不了解您的 CI 程序的情況下,很難准確地說出,但重點仍然是,如果您認為您正在刪除文件,則文件系統很可能保留了它們的部分或全部內容。

順便說一句,既然您提到您在 AWS 上,您可能會考慮使用無服務器 CI 部署,以便您的容器在每次運行時都從零開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM