web-dev-qa-db-ja.com

docker overlayディレクトリをクリーンアップする方法は?

CoreOSとAWSのECSを介してdockerを実行しています。失敗したイメージが何度も再起動しましたが、コンテナーはまだ存在し、ドライブパーティションがいっぱいになりました。具体的には、/var/lib/docker/overlay/には多数のファイル/ディレクトリが含まれています。

docker-cleanup-volumes が問題であることは知っていますが、/ overlayディレクトリではなく、/ volumesディレクトリをクリーンアップします。

docker ps -aは、悪いDockerコンテナで250を超える開始試行を示しています。ただし、実行されていません。

rm -rf /var/lib/docker/overlay/*以外に、どうすればこれをクリーンアップできますか?

28
tedder42

私たちの側から:

Sudo docker system Prune -a -f

3Goを救ってくれます!

有名なコマンドも使用します:

Sudo docker rm -v $(Sudo docker ps -a -q -f status=exited)
Sudo docker rmi -f  $(Sudo docker images -f "dangling=true" -q)
docker volume ls -qf dangling=true | xargs -r docker volume rm

これをcronに配置して、ディスクスペースをもう少し効率的に管理します。

乾杯

参照: https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4

22
user3774109

これが今私がやっているハックな方法です。より良い方法があることを望んでいるので、私はそれを答えとして受け入れるつもりはありません。

# delete old docker processes
docker rm `docker ps -a | grep Exited | awk '{print $1 }'`
  ignore_errors: true

# delete old images. will complain about still-in-use images.
docker rmi `docker images -aq`
10
tedder42

私はこれを開発環境のbashrcに追加し、毎日実行することに慣れました。

function cleanup_docker() {
  docker ps -f status=exited -q | xargs -r docker rm
  docker images -f dangling=true -q | xargs -r docker rmi
}

場合によっては、次のスクリプトはすべてのイメージを削除しようとするため、より多くのスペースを解放できますが、単に失敗します。

function cleanup_docker_aggressive() {
  for i in $(docker images --no-trunc -q | sort -u)
  do
    docker rmi $i 2> /dev/null
  done
}

悲しいことに、彼らはあなたのソリューションよりもかなりきれいではありません。

編集:Docker 1.13以降では、 docker system を使用できます。

docker system df    # to check what is using space
docker system Prune # cleans up also networks, build cache, etc

編集:Docker 2017.09以降、 container および image を使用することもできます

docker container Prune
docker image Prune -a

後者は、--filter "until=24h"のような派手なフィルターで使用できます

7
analytik

私たちはこの問題を抱え始めたばかりであり、btafareloの答えは私に道の一部を与えてくれました。

システム情報:ELBの背後でCoreOS 1.12を実行しているec2インスタンス

  • ELBからdockerインスタンスをドレーンします
  • シャットダウンドッカー

    systemctl stop docker
    rm -rf /var/lib/docker/overlay/*
    
  • コマンドの結果を実行する

    for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done
    
  • 再起動(すべてを復旧する最も簡単な方法)

これにより、サービスが再起動された後、悪影響なしでディスクの約25%が回復しました。

5
Kevin McFadden

ドッカーps

  • - 静か

  • - すべて

  • --filter status = exited


ドッカーrm

  • - 力

ドッカー画像

  • - 静か
  • - すべて
  • --filter dangling = true

ドッカーrmi

  • -力

あなたのハックな方法は問題ありません。

docker rm `docker ps -a | grep Exited | awk '{print $1 }'`

私のハッキーな方法は

docker rm $(docker ps --all | awk '/ago/{print $1}')

少しきれいな方法は、docker ps(-q)フラグを付けて--quietを実行してID番号のみを取得し、--filter status=exitedを終了したものだけをフィルターすることです。

docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes

または、docker rm(-f)フラグを使用して--forceを実行し、docker ps(-a)フラグを使用して--allを実行して、実行中のものもシャットダウンする

docker rm --force $(docker ps --all --quiet) # remove all docker processes

おそらく、いくつかのビルドが失敗した後、そのディスク容量をすべて占有しているのはイメージです。 Dockerホストのディスク容量を節約するには、使用していないDockerイメージを定期的に削除します

docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images

または、より積極的にするには、--force(-f)をクリーンアップして--all(-a)イメージをクリーンアップします。

docker rmi --force $(docker images --all --quiet) # clean all possible docker images

@analytikの 。bashrc 関数に入れる方法は実用的なアイデアのようです

function cleanup_docker() {
  docker rm --force $(docker ps --all --quiet) # remove all docker processes
  docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
}

不要なドッカー画像を大量に生成する習慣がある場合は、それを 。bash_logout に追加します


2
woodvi

Dockerガベージコレクションは、別のdockerコンテナを使用して簡単に行うことができます https://github.com/spotify/docker-gc

https://github.com/flaccid/docker-docker-gc-crond を使用して、cronとして実行することができます。

1
Foreever

注意してください、このソリューションは他の重要なものを削除するようです。

画像/コンテナを検査し、検査の実行で見つからなかった/ opt/docker/overlay内のフォルダーを削除する必要があります

docker inspect $(docker ps -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt

docker inspect $(docker images -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt

Sudo ls -l /var/lib/docker/overlay > overlays.txt

diff -u  inspect-hashs.txt overlays.txt | grep -E '^\+' | grep -oE '[a-f0-9]{64}' | xargs Sudo rm -rf /opt/docker/overlay/
0
btafarelo

これは https://lebkowski.name/docker-volumes/ からdocker overlayディレクトリを削除するための解決策です

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi

docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v

docker <1.9の場合:

find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)')

またはDocker> = 1.9の場合:

docker volume ls -qf dangling=true | xargs -r docker volume rm
0
Wolvverine