特定のDockerコンテナに溜まった大量のゴミファイルの掃除

シェアする

Voiced by Amazon Polly

小規模なMastodonインスタンスを運用しているときの話。なぜか、とあるインスタンスでストレージが予期せず満杯になる事態が発生。
さらに、/var/lib/docker/overlay2が肥大化していることも発覚。ということで、これを今回は掃除していきます。

以下の方法はたまたま成功しましたが、もしかすると誤って重要なファイルを消してしまう可能性もあります。よくわからない場合は行わないでください。
実行するにあたっては、事前にスナップショットやバックアップを作成しておくことを強くお勧めします。
広告



原因は本当か?

原因調査のため、duコマンドを使って掘り進めて行きます。
[root@eleanor ~]# du -sh /var/lib/docker/overlay2/*
以下の出力は掃除してしまった後なのですが、この中に20GB以上の容量を食っているコンテナがありました。
5.5G /var/lib/docker/overlay2/(省略)
このコンテナが犯人のようです。

さらに掘り進める

次の4つのディレクトリが見つかりました。
[root@eleanor ~]# du -sh /var/lib/docker/overlay2/(省略)/*
2.2G /var/lib/docker/overlay2/(省略)/diff
4.0K /var/lib/docker/overlay2/(省略)/link
4.0K /var/lib/docker/overlay2/(省略)/lower
3.4G /var/lib/docker/overlay2/(省略)/merged
8.0K /var/lib/docker/overlay2/(省略)/work

この中で、mergedが実際にdockerコンテナのファイルシステムを再現しているディレクトリのようです。
さらに掘り進んだところ、その中のtmpディレクトリがストレージ容量を圧迫していることを発見しました。
何らかの原因で、無駄な一時ファイルが溜まった上に削除もされなくなってしまったようです。

簡単には消せない

さて、このtmpディレクトリの中身を見てみようと……思ったのですが、諦めました。
なぜかというと、ファイル数があまりにも多すぎたためです。
[root@eleanor ~]# du -sh /var/lib/docker/overlay2/(省略)/merged/tmp/*
-bash: /usr/bin/du: Argument list too long

OSはコマンドにワイルドカードがあった場合にそのコマンドを展開するのですが、展開できる長さには上限があり、ファイル数が多すぎてその上限にぶつかってしまったようです。
諦めて削除したいのですが、そのまま一筋縄ではいきません。
同じく、ファイル数が多すぎて引数の長さの上限を超えてしまうからです。
[root@eleanor ~]# rm -rf /var/lib/docker/overlay2/(省略)/merged/tmp/*
-bash: /usr/bin/rm: Argument list too long

多すぎるファイルを消す

あまりにも多すぎるファイルを削除するためには、findコマンドおよびxargsコマンドを用います。
[root@eleanor ~]# find /var/lib/docker/overlay2/(省略)/merged/tmp -type f -print | xargs rm
findコマンドで、当該ディレクトリのファイルリストを出力します。-type fで、ファイルのみに制限します。-type dにすると、ディレクトリが対象になります。
パスは、問題のディレクトリを指定します。相対パスでも構いません。
-printにより、それらのリストを出力します。パイプを行い、その出力をxargsコマンドに渡します。
xargsコマンドに渡った出力は、その後に続くコマンドの引数として使われます。ここでは、rmコマンドに渡しています。

動作としては、findコマンドの引数をxargs経由でrmコマンドに流すものになります。Argument list too long(引数が長すぎます)と怒られるほどファイル数が多くても、この方法を使うことで大量のファイルを削除できます。

一時ファイルの堆積に注意

気づかないうちに、一時ファイルが堆積しているケースはよくあります。多くの場合は自動で削除されますが、不具合により削除されず、ディスク容量を圧迫することもあります。
今回は特定のDockerコンテナでその事象が発生していました。復旧できましたが、今後も定期的にチェックする必要がありそうです。

掃除の結果

最終的に、約21GBのストレージ容量を確保できました。

mastodon:media:remove_remoteを実行しても効果がほとんど得られませんでしたが、一時ファイルの削除によって多くの空き容量を確保できました。