バックグラウド
この問題の原因は、コンテナボリュームの設定ミスと、これらのボリュームに書き込まれた一時データのDockerリーク(リリースの失敗)の問題に分けられます。アプリが頻繁におよび/または大量に書き込むコンテナの一時/ログ/スクラッチフォルダのすべてを(ホストフォルダまたは他の永続的なストレージクレームのいずれかに)マッピングする必要があります。Dockerは、デフォルトでにある、自動的に作成されたいわゆるEmptyDirのすべてのクリーンアップについて責任を負いません/var/lib/docker/overlay2/*/diff/*
。これらの「非永続的」フォルダーの内容は、コンテナーが停止した後、dockerによって自動的にパージされる必要がありますが、明らかにそうではありません(コンテナーがまだ実行されている場合は、ホスト側からパージすることさえ不可能な場合があります。また、数か月間実行される可能性があります。一度に)。
回避策
回避策には注意深い手動クリーンアップが必要です。すでに他の場所で説明されていますが、私のケーススタディからいくつかのヒントが見つかる場合があります。これは、可能な限り有益で一般化できるようにしようとしました。
何が起こったのかというと、犯人のアプリ(私の場合clair-scanner
)は、数か月にわたって数百ギガのデータを/diff/tmp
docker'sのサブフォルダーに書き込むことができました。overlay2
du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp
271G total
のすべてのサブフォルダー/diff/tmp
はかなり自明だったので(すべてが形式でclair-scanner-*
あり、廃止された作成日がありました)、関連するコンテナー(docker stop clair
)を停止し、これらの廃止されたサブフォルダーをから慎重に削除diff/tmp
しました。 Dockerエンジンへの影響のテスト(systemctl restart docker
ディスクスペースを再利用するために再起動[ ]が必要でした):
rm -rf $(ls -at /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp | grep clair-scanner | tail -1)
Dockerを再インストールしたり、フォルダー全体を削除したりすることなく、数百ギガのディスクスペースを再利用しました。ディスクスペースを再利用するにはdockerデーモンの再起動が必要だったため、実行中のすべてのコンテナーを一度に停止する必要がありました。最初に、フェイルオーバーコンテナーが他のノードで正しく実行されていることを確認してください。docker prune
コマンドが(さらに別のスイッチを介し/diff/tmp
て/diff/*
)廃止された(または)データもカバーできることを願っています。
これは現在3年前の問題であり、Dockerフォーラムでその豊かでカラフルな歴史を読むことができます。ここでは、上記のソリューションのアプリケーションログを対象としたバリアントが2019年に提案され、いくつかのセットアップで機能したようです:https:// forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604