Dockerは使用中ですが、Dockerコンテナはありません


166

Docker 1.9.1でDockerボリュームを削除するときに問題が発生しました。

docker ps -a空のコンテナが返されるように、停止したコンテナをすべて削除しました。

を使用するとdocker volume ls、Dockerコンテナのホスト全体が提供されます。

docker volume ls
DRIVER              VOLUME NAME
local               a94211ea91d66142886d72ec476ece477bb5d2e7e52a5d73b2f2f98f6efa6e66
local               4f673316d690ca2d41abbdc9bf980c7a3f8d67242d76562bbd44079f5f438317
local               eb6ab93effc4b90a2162e6fab6eeeb65bd0e4bd8a9290e1bad503d2a47aa8a78
local               91acb0f7644aec16d23a70f63f70027899017a884dab1f33ac8c4cf0dabe5f2c
local               4932e2fbad8f7e6246af96208d45a266eae11329f1adf176955f80ca2e874f69
local               68fd38fc78a8f02364a94934e9dd3b5d10e51de5b2546e7497eb21d6a1e7b750
local               7043a9642614dd6e9ca013cdf662451d2b3df6b1dddff97211a65ccf9f4c6d47
#etc x 50

これらのボリュームには重要なものが含まれていないため、ですべてのボリュームをパージしようとしdocker volume rm $(docker volume ls -q)ます。

その過程で、大部分が削除されますが、私は取り戻します:

Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use

それらのかなりの部分について。そもそもコンテナがない場合、これらのボリュームはどのように使用されますか?


7
dockerは参照カウントを使用して、ボリュームがまだ使用されているかどうかを確認します。これはすべてメモリ内で行われます。これは、バグまたは競合状態である可能性があり、コンテナは削除されましたが、カウンタは更新されていません。デーモンを再起動すればこれは解決するはずですが、はい、どこかにバグがある可能性があります。特別な設定はありますか(例:docker-in-docker、Swarmを使用していますか?)コンテナーをクリーンアップするためにスクリプトまたはツールを使用していますか?
thaJeztah 2016年

5
@thaJeztahがDockerデーモン(sudo service docker stopおよびsudo service docker start)を再起動して、これらのゴーストボリュームをすべてクリアしました。さらに、docker rm -vコマンドを使用して問題なくボリュームを削除できるようになりました。使用法の顕著な違いは、Ubuntu 15.10でdocker-composeを使用していることだけです。この問題を再現できる場合は報告しますが、それ以外の場合は単純な再起動で十分なようです。ありがとう!
Tkwon123

2
再起動後も、それはまだ...ドッキングウィンドウのボリュームが使用中であると言う
ホルムズ

10
docker composeを使用する場合は、-vをdownコマンドに追加して、ボリュームを削除できます。
Niels Bech Nielsen

5
これを修正するには、dockerを停止してから、ボリュームをファイルシステムから削除し、dockerを再起動します。service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom 2017年

回答:


169

これらの関数を使用して、Docker関連のすべてを残酷に削除できます。

removecontainers() {
    docker stop $(docker ps -aq)
    docker rm $(docker ps -aq)
}

armageddon() {
    removecontainers
    docker network prune -f
    docker rmi -f $(docker images --filter dangling=true -qa)
    docker volume rm $(docker volume ls --filter dangling=true -q)
    docker rmi -f $(docker images -qa)
}

これらを~/Xrcファイルに追加できます。Xはシェルインタープリター(~/.bashrcbashを使用している場合)ファイルで、を実行して再ロードできますsource ~/Xrc。また、それらをコンソールにコピーして貼り付けるだけで、後で(関数を準備するために以前に行ったオプションに関係なく)次のように実行できます。

armageddon

また、一般的なDockerのクリーンアップにも役立ちます。これにより、コンテナー(実行中かどうかに関係なく)とあらゆる種類のボリュームだけでなく、イメージも削除されることに注意してください。


3
質問によると、docker volume rmコマンドは失敗していました。コメントから、解決策はdockerデーモンを再起動して参照カウントを修正することです。
BMitch 2017

2
@BMitchあなたはコメントを通じて慎重に読めば、このための解決策ではありません:even after reboot it still says docker volume is in use..
デヴィッド・ゴンサレス・ルイス

1
holmsには別の問題があるようで、質問を投稿したものではありません。その上のコメントを1つ検索してください。
BMitch 2017

10
ゴンセル、,関数名ですが、綴られていますarmageddon
Joseph Sheedy

1
これは私の問題を解決しませんでした。でも使用docker-compose down --volumesした(@Robert K. Bellの提案による)
BiAiB

159

おそらく、ボリュームはdocker-compose?その場合は、次の方法で削除する必要があります。

docker-compose down --volumes

Niels Bech Nielsenの功績です。


3
これは機能します:)これはすべてのコンテナ自体も削除することに注意してください。永続的なマウント上になく、イメージ内にないコンテナー内のファイルを変更した場合、これは望ましくない可能性があります。
Alexander Varwijk

58

私はDockerにかなり慣れていません。私はいくつかの初期テストの混乱をクリーンアップしており、ボリュームも削除できませんでした。実行中のすべてのインスタンスを停止し、を実行しdocker rmi -f $(docker image ls -q)ましたが、それでも受信しましたError response from daemon: unable to remove volume: remove uuid: volume is in use

私はそうしました、docker system pruneそしてそれは最後のボリュームを取り除くために必要なものを片付けました:

[0]$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
... about 15 containers UUID's truncated

Total reclaimed space: 2.273MB
[0]$ docker volume ls
DRIVER              VOLUME NAME
local              uuid
[0]$ docker volume rm uuid
uuid
[0]$

docker system prune

このコマンドを使用するには、クライアントAPIとデーモンAPIの両方が少なくとも1.25である必要があります。docker versionクライアントでコマンドを使用して、クライアントとデーモンのAPIバージョンを確認します。


何らかの理由で、それが機能する前に2回これを実行する必要がありました。
mameluc

1
「docker system prune」を実行してから、「docker volume rm volume_name」を実行する必要がありました。何らかの理由で、すでに削除した削除済みコンテナーをプルーニングします。混乱した
マシューライドアウト、

54

停止しているコンテナの1つがボリュームを使用できます。このようなコンテナはコマンドで削除できます。

docker container prune

次に、未使用のボリュームを削除できます

docker volume prune

1
これは受け入れられる答えでなければなりません。なぜ人々が与えられた答えを好むのか分からない
Elger Mensonides

9

ボリュームがコンテナーに関連付けられている限り(実行中かどうかにかかわらず)、ボリュームを削除することはできません。

あなたは走らなければならない

docker inspect <container-id>/<container-name>

このボリュームがマウントされている可能性のある実行中/非実行コンテナのそれぞれ。

ボリュームがいずれかのコンテナーにマウントされている場合は、inspectコマンドの出力のMountsセクションに表示されます。このようなもの :-

"Mounts": [
            {
                "Type": "volume",
                "Name": "user1",
                "Source": "/var/lib/docker/volumes/user1/_data",
                "Destination": "/opt",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

責任のあるコンテナを見つけた後、次を使用します:-

docker rm -f container-1 container-2 ...container-n コンテナを実行している場合

docker rm container-1 container-2 ...container-n 実行されていないコンテナの場合

ホストマシンからコンテナを完全に削除します。

次に、次のコマンドを使用してボリュームを削除してみます。

docker volume remove <volume-name/volume-id>


1
有用な答えを得るには、この反応を拡張する必要があります。これを確認する方法に関する情報を追加します。
Jeroen Heier

1
docker container pruneほとんどの場合、私は十分であるに違いない。
x-yuri 2018

6

現在、Dockerが提供する機能を使用して、一般的でより完全なクリーニングを実行できます。

docker system prune

停止しているコンテナーと未使用のすべてのイメージ(ダングリングイメージだけでなく)をさらに削除する-aには、コマンドにフラグを追加します。

docker system prune -a

3

これらのボリュームが実際にシステムにマウントされていると確信しています。/ proc / mountsを見ると、そこに表示されます。sudo umount <path>またはする必要がありsudo umount -f -n <path>ます。マウントされたパスを/ proc / mountsから取得するか、またはdocker volume inspect


-3

このコマンドは、フラグ-f(force)を付けて入力する必要があります。

sudo docker volume rm -f <VOLUME NAME>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.