我有几个码头集装箱。我正面临存储问题。
当我执行以下命令时,主机(不在 docker 容器中)以测量所有文件的大小
du -sh /
我可以看到总大小是总存储空间的 50%。
当我这样做时
df -h
我可以看到我有 20% 的可用空间,而我使用了 80%。
我使用 lsof 命令来查找已删除的打开文件,它提到了来自 Docker 容器的许多文件:
lsof -nP | grep '(deleted)'
如何解释差异?我想念 docker 配置的东西?
我有几个码头集装箱。我正面临存储问题。
当我执行以下命令时,主机(不在 docker 容器中)以测量所有文件的大小
du -sh /
我可以看到总大小是总存储空间的 50%。
当我这样做时
df -h
我可以看到我有 20% 的可用空间,而我使用了 80%。
我使用 lsof 命令来查找已删除的打开文件,它提到了来自 Docker 容器的许多文件:
lsof -nP | grep '(deleted)'
如何解释差异?我想念 docker 配置的东西?
这个问题在 Unix 环境中是一个非常普遍的问题。
在 Unix 中,您可以从文件系统中删除文件,但如果有一个进程仍在该文件上持有打开的文件句柄,则该文件仍存储并保存在磁盘上,只能通过该文件句柄使用。一旦文件句柄被删除(关闭或进程终止),内核将负责从磁盘中删除文件的其余部分并释放磁盘空间。
这样的临时文件会影响 的输出df
,但不会出现在du
只扫描目录的输出中。
此功能通常用于使用应在进程终止时自动删除的临时文件:为了获得这样的东西,进程创建一个文件(通过打开它进行写入)并保持文件句柄打开但删除(unlink(2))文件本身(即删除目录条目)。然后进程仍然可以通过文件句柄写入该文件并从中读取,并且在终止后它不必自行清理。
Docker 的东西似乎经常有这样的东西。
您的解决方案是关闭所有这些打开的文件句柄。
这可以通过(从霰弹枪到手术刀)来实现:
要查看进程已打开的文件句柄,您可能(取决于您的系统)查看/proc/<PID>/fd/
. 对于每个进程,存在这样一个目录并代表文件句柄。