web-dev-qa-db-ja.com

古くて未使用のDockerイメージを削除する方法

Dockerを長時間実行していると、システムにたくさんのイメージがあります。未使用のDockerイメージを安全に一度に削除してストレージを解放するにはどうすればよいですか。

さらに、数か月前に取得した、正しいTAGを持つ画像も削除したいと思います。

だから、私はタグなしの画像だけを削除することを求めていません。私は、タグ付けされていない画像や、数ヶ月前に正しいTAGで引っ張られた画像など、未使用の一般的な画像を削除する方法を探しています。

563
Quanlong

2016年9月の更新:Docker 1.13: PR 26108 および commit 86de7c いくつかの新しいコマンドを導入して、Dockerデーモンデータがディスク上で占有している容量を視覚化するのに役立つ「不要な」過剰を簡単にクリーンアップします。

docker system Prune は、すべてのダングリングデータを削除します(つまり、順序:コンテナが停止し、コンテナのないボリュームとコンテナのないイメージ)。 -aオプションを使用した未使用データでも。

あなたも持っています:

未使用画像の場合は、docker image Prune -aを使用します(ぶら下がりand未使用画像を削除するため)。
警告: 'nused'は「コンテナによって参照されていないイメージ」を意味します。-aを使用する前に注意してください。

ALanswer に示すように、docker system Prune --allはすべてのnused画像を削除します。

docker xxx Prune--filterオプション の組み合わせは、プルーニングを制限するための優れた方法です( docker SDK API 1.28最小、したがってdocker 17.04 +

現在サポートされているフィルターは次のとおりです。

  • until (<timestamp>)-指定されたタイムスタンプの前に作成されたコンテナ、画像、およびネットワークのみを削除します
  • labellabel=<key>label=<key>=<value>label!=<key>、またはlabel!=<key>=<value>)-コンテナー、イメージ、ネットワーク、およびボリュームのみを削除します(またはlabel!=...を使用する場合はwithoutを使用)。

例については、「 Prune images 」を参照してください。


元の回答(2016年9月)

私は通常:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

それらの[ダングリングイメージ]を削除するためのエイリアス1drmi

dangling=trueフィルターは未使用の画像を検出します

これにより、ラベル付き画像によって参照されなくなった中間画像は削除されます。

終了したプロセス(コンテナ) に対して同じfirstを行う

alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'

haridsv 指摘 コメント内

技術的には、最初にコンテナをクリーンアップしてからイメージをクリーンアップする必要があります。これにより、より多くのぶら下がりイメージが検出され、エラーが少なくなります


Jess Frazelle(jfrazelle) には bashrc関数 があります:

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}

「参照されていない」イメージだけでなく、古いイメージを削除するには、 docker-gc を検討できます。


シンプルなDockerコンテナーとイメージガベージコレクションスクリプト。

  • 1時間以上前に終了したコンテナは削除されます。
  • その後、残りのコンテナに属さない画像は削除されます。
1283
VonC

2番目を更新します(2017-07-08):

さらに最近のsystem Pruneを使用して、(再び)VonCを参照してください。せっかちな人は-f, --forceオプションでプロンプトをスキップすることができます。

docker system Prune -f

せっかちとreckless-a, --allオプションで "ぶら下がっているものだけでなく未使用の画像"を追加で削除することができます:

docker system Prune -af

https://docs.docker.com/engine/reference/commandline/system_Prune/

更新:

最近追加されたPruneコマンドを使用する VonCの答え を参照してください。これは対応するシェルエイリアスの便利さです。

alias docker-clean=' \
  docker container Prune -f ; \
  docker image Prune -f ; \
  docker network Prune -f ; \
  docker volume Prune -f '

古い答え:

停止した(終了した)コンテナを削除します。

$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

未使用の(ぶら下がっている)画像を削除します。

$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

取消不能なデータ損失 に関して 細心の注意 を行使した場合は、未使用の(未使用の)ボリュームを削除できます(v1.9)。そしてアップ):

$ docker volume ls -qf "dangling=true" | xargs docker volume rm

ここでは、それらは便利なシェルエイリアスにあります。

alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

参考文献:

92
rubicks

1ヶ月以上前の old tagged imagesを削除するには:

$ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' \
    | grep ' months' | awk '{ print $1 }' \
    | xargs --no-run-if-empty docker rmi

リポジトリで参照されているコンテナによって使用されている画像を削除するには fail を使用します。そうでない場合は、-fフラグを追加するだけです。

/etc/cron.daily/docker-gcスクリプトの例:

#!/bin/sh -e

# Delete all stopped containers (including data-only containers).
docker ps -a -q --no-trunc --filter "status=exited" | xargs --no-run-if-empty docker rm -v

# Delete all tagged images more than a month old
# (will fail to remove images still used).
docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' | grep ' months' | awk '{ print $1 }' | xargs --no-run-if-empty docker rmi || true

# Delete all 'untagged/dangling' (<none>) images
# Those are used for Docker caching mechanism.
docker images -q --no-trunc --filter dangling=true | xargs --no-run-if-empty docker rmi

# Delete all dangling volumes.
docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm
47
Wernight

Docker 1.13 またはそれ以上のバージョンを持っていると仮定すると、単にPruneコマンドを使うことができます。特に古い画像を削除するためのあなたの質問のために、あなたは最初のものが欲しいです。

# Remove unused images
docker image Prune

# Remove stopped containers.
docker container Prune

# Remove unused volumes
docker volume Prune

# Remove unused networks
docker network Prune

# Command to run all prunes:
docker system Prune

私はnotdocker system Pruneコマンドの使用に慣れることをお勧めします。ユーザーが誤って意図しないものを削除してしまうと思います。個人的には、主にdocker image Pruneおよびdocker container Pruneコマンドを使用します。

17
Programster

他の答えは、特に素晴らしいです。

docker system Prune # doesn't clean out old images
docker system Prune --all # cleans out too much

しかし、2つのコマンドの中間に何か必要なので、filterオプションが必要でした。

docker image Prune --all --filter "until=4320h" # delete images older than 6 months ago; 4320h = 24 hour/day * 30 days/month * 6 months

それが役立つことを願っています:)

参考: https://docs.docker.com/config/pruning/#Prune-images

15
A L

これは私のために働いた:

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
12
Mahmoud Zalt

今まで(Dockerバージョン1.12)、実行中のすべてのコンテナを削除するために次のコマンドを使用しています。また、ボリュームを削除したい場合は、次のコマンドでそれぞれのタグ-vを使用して手動で削除できます。

終了したコンテナをすべて削除

docker rm $(docker ps -q -f status=exited)

停止したコンテナをすべて削除

docker rm $(docker ps -a -q)

実行中および停止中のすべてのコンテナを削除

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

条件なしですべてのコンテナを削除

docker container rm $(docker container ps -aq)

しかし、バージョン1.13以降では、完全なシステムとクリーンアップのために、次のコマンドを直接使うことができます。

docker system Prune

未使用のコンテナ、イメージ、ネットワーク、ボリュームはすべて削除されます。個々のコンポーネントをクリーンアップする次のコマンドを使用してこれを行うこともできます。

docker container Prune
docker image Prune
docker network Prune
docker volume Prune
8
mohan08p

私は最近私のサーバーの一つでこれを解決するためのスクリプトを書きました:

#!/bin/bash

# Remove all the dangling images
DANGLING_IMAGES=$(docker images -qf "dangling=true")
if [[ -n $DANGLING_IMAGES ]]; then
    docker rmi "$DANGLING_IMAGES"
fi

# Get all the images currently in use
USED_IMAGES=($( \
    docker ps -a --format '{{.Image}}' | \
    sort -u | \
    uniq | \
    awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \
))

# Get all the images currently available
ALL_IMAGES=($( \
    docker images --format '{{.Repository}}:{{.Tag}}' | \
    sort -u \
))

# Remove the unused images
for i in "${ALL_IMAGES[@]}"; do
    UNUSED=true
    for j in "${USED_IMAGES[@]}"; do
        if [[ "$i" == "$j" ]]; then
            UNUSED=false
        fi
    done
    if [[ "$UNUSED" == true ]]; then
        docker rmi "$i"
    fi
done
7
Ell Neal

Dockerの画像を整理してスペースを取り戻すためのスクリプトです。

#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm

## If you do not want to remove all container you can have filter for days and weeks old like below
#docker ps -a | grep Exited | grep "days ago" | awk '{print $1}' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print $1}' | xargs docker rm

## Removing Dangling images
## There are the layers images which are being created during building a Docker image. This is a great way to recover the spaces used by old and unused layers.

docker rmi $(docker images -f "dangling=true" -q)

## Removing images of perticular pattern For example
## Here I am removing images which has a SNAPSHOT with it.

docker rmi $(docker images | grep SNAPSHOT | awk '{print $3}')

## Removing weeks old images

docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi

## Similarly you can remove days, months old images too.

オリジナルの台本

https://github.com/vishalvsh1/docker-image-cleanup

通常Dockerは画像の構築とレイヤーに関連するすべての一時ファイルを

/var/lib/docker

このパスはシステムに対してローカルで、通常はルートパーティションの "/" です。

もっと大きなディスク容量をマウントして/var/lib/dockerの内容を新しいマウント位置に移動してシンボリックリンクを作成することができます。

こうすれば、たとえDockerイメージがスペースを占有していても、他のマウント位置を使用することになるのでシステムには影響しません。

元の投稿:ローカルディスク上のDockerイメージの管理

私はこのコマンドを使っています:

export BEFORE_DATETIME=$(date --date='10 weeks ago' +"%Y-%m-%dT%H:%M:%S.%NZ")
docker images -q | while read IMAGE_ID; do
    export IMAGE_CTIME=$(docker inspect --format='{{.Created}}' --type=image ${IMAGE_ID})
    if [[ "${BEFORE_DATETIME}" > "${IMAGE_CTIME}" ]]; then
        echo "Removing ${IMAGE_ID}, ${BEFORE_DATETIME} is earlier then ${IMAGE_CTIME}"
        docker rmi -f ${IMAGE_ID};
    fi;
done

これにより、作成時間が10週間以上前の画像がすべて削除されます。

3
Yonatan Kiron

Xヶ月前に引っ張った画像を削除したい場合は、3か月前に作成した画像を削除する以下の例を試すことができます。

three_months_old_images=`docker images | grep -vi "<none>" | tr -s ' ' | cut -d" " -f3,4,5,6 | grep "3 months ago" | cut -d" " -f1`
docker rmi $three_months_old_images
3
spectre007

数週間前に古い容器を取り除いてください。

docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')

数週間前に古い画像を削除します。注意してください。これは数週間前に作成されたがあなたの新しい画像が使用しているかもしれないベース画像を削除します。

docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')

2
Antony.H

タグ付き画像を削除する方法

  1. docker rmi最初のタグ 

  2. 港湾労働者のRMI画像。 

    #1つのdocker rmi callで実行できる例:# docker rmi <repo:tag> <imageid>

(これは2016年11月に動作する、Dockerバージョン1.12.2)

例えば.

$ docker images 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
usrxx/the-application   16112805            011fd5bf45a2        12 hours ago        5.753 GB
usryy/the-application   vx.xx.xx            5af809583b9c        3 days ago          5.743 GB
usrzz/the-application   vx.xx.xx            eef00ce9b81f        10 days ago         5.747 GB
usrAA/the-application   vx.xx.xx            422ba91c71bb        3 weeks ago         5.722 GB
usrBB/the-application   v1.00.18            a877aec95006        3 months ago        5.589 GB

$ docker rmi usrxx/the-application:16112805 && docker rmi 011fd5bf45a2
$ docker rmi usryy/the-application:vx.xx.xx && docker rmi 5af809583b9c
$ docker rmi usrzz/the-application:vx.xx.xx eef00ce9b81f
$ docker rmi usrAA/the-application:vx.xx.xx 422ba91c71bb
$ docker rmi usrBB/the-application:v1.00.18 a877aec95006

例えば2週間以上経過したものをスクリプトで削除します。

IMAGESINFO=$(docker images --no-trunc --format '{{.ID}} {{.Repository}} {{.Tag}} {{.CreatedSince}}' |grep -E " (weeks|months|years)")
TAGS=$(echo "$IMAGESINFO" | awk '{ print $2 ":" $3 }' )
IDS=$(echo "$IMAGESINFO" | awk '{ print $1 }' )
echo remove old images TAGS=$TAGS IDS=$IDS
for t in $TAGS; do docker rmi $t; done
for i in $IDS; do docker rmi $i; done
2
gaoithe

@VonCはすでにとてもいい答えを出していますが、完全を期すためにここで使用している小さなスクリプトを示します。

#!/bin/bash

imgs=$(docker images | awk '/<none>/ { print $3 }')
if [ "${imgs}" != "" ]; then
   echo docker rmi ${imgs}
   docker rmi ${imgs}
else
   echo "No images to remove"
fi

procs=$(docker ps -a -q --no-trunc)
if [ "${procs}" != "" ]; then
   echo docker rm ${procs}
   docker rm ${procs}
else
   echo "No processes to purge"
fi
2

docker system Prune -a

(コマンドを確認するように求められます。実行していることがわかっている場合は、強制的に実行するには-fを使用してください)

2
Vojtech Vitek

コンテナが動作していないタグ付き画像を削除するには、小さなスクリプトを使用する必要があります。

#!/bin/bash

# remove not running containers
docker rm $(docker ps -f "status=exited" -q)

declare -A used_images

# collect images which has running container
for image in $(docker ps | awk 'NR>1 {print $2;}'); do
    id=$(docker inspect --format="{{.Id}}" $image);
    used_images[$id]=$image;
done

# loop over images, delete those without a container
for id in $(docker images --no-trunc -q); do
    if [ -z ${used_images[$id]} ]; then
        echo "images is NOT in use: $id"
        docker rmi $id
    else
        echo "images is in use:     ${used_images[$id]}"
    fi
done
2
ospider
docker rm `docker ps -aq`

または 

docker rm $(docker ps -q -f status=exited)
2
mainframer

自動的にまたは定期的に既存のコンテナをクリーンアップし、実行中のコンテナで使用されていないイメージとボリュームを削除したい場合は、イメージmeltwater/docker-cleanupをダウンロードできます。

とにかく走れ:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

デフォルトでは30分ごとに実行されます。ただし、秒単位でこのフラグを使用することで遅延時間を設定できます(DELAY_TIME = 1800オプション)。

より多くの詳細: https://github.com/meltwater/docker-cleanup/blob/master/README.md

1
Innocent Anigbo

すべての画像とボリュームも整理する
docker system Prune -af --volumes

0
Zaytsev Dmitry

ときどき、特定のイメージや既存のコンテナにスペースが割り当てられていなくても、Dockerがディスクスペースを割り当てて使い続けるという問題に遭遇しました。私が誤ってこの問題を起こした最新の方法はRHEL 7.1の "docker"の代わりに "docker-engine" centos buildを使ったことです。起こるように思われることは時々容器の一掃が首尾よく完了しないで、そして次にスペースが決して再利用されないということです。私が/として割り当てた80GBのドライブが/ var/lib/dockerファイルでいっぱいになったとき、私はこの問題を解決するための独創的な方法を考え出す必要がありました。 

これが私が思いついたものです。最初にディスクフルエラーを解決します。

  1. Stop docker:systemctl stop docker
  2. Say/mnt/dockerとしてマウントされている新しいドライブを割り当てました。
  3. / var/lib/docker内のすべてのファイルを/ mnt/dockerに移動します。私は次のコマンドを使用しました。rsync -aPHSx - 削除ソースファイル/ var/lib/docker// mnt/docker /
  4. 新しいドライブを/ var/lib/dockerにマウントします。

この時点で、私はディスクフルエラーはもうありませんでしたが、それでも膨大なスペースを無駄にしていました。次のステップはそれを大事にすることです。

  1. Dockerを起動します。systemctl start docker

  2. すべての画像を保存します。 docker save $(docker画像| sed -e '/ ^/d' -e '/ ^リポジトリ/ d' -e '、[] [] 、:、 '-e'、、[] , ')> /root/docker.img

  3. Dockerをアンインストールします。

  4. /var/lib/docker:rm -rf/var/lib/docker/[cdintv] *内のすべてを消去します。

  5. Dockerを再インストールします

  6. Dockerを有効にする:systemctl dockerを有効にする

  7. 開始ドッカー:systemctl開始ドッカー

  8. 画像を復元する: docker load </root/docker.img

  9. 実行する必要がある永続的なコンテナを起動します。

これにより、ディスク使用量がdockerの67 GBからdockerの6 GBに減少しました。

私はこれを毎日の使用にはお勧めしません。しかし、dockerがソフトウェアエラーや予期しない再起動のためにディスクの空き容量を見失ったようなときに実行すると便利です。

0
briemers
docker rm $(docker ps -faq)
docker rmi $(docker ps -faq)
0
marven

スズメプラグインがあります docker-remove-dangling-images 停止したコンテナや未使用の(未使用の)画像を整理するのに使用できます。

$ sparrow plg run docker-remove-dangling-images

LinuxとWindows OSの両方で動作します。

0
Alexey Melezhik

まず、docker imagesを実行して画像のリストを表示し、IMAGE HASH IDをクリップボードにコピーします。

docker rmi -f <Image>を実行します

オプション-fは強制削除であることを忘れないでください。

0
Le Khiem