Docker используется по объему, но Docker-контейнеров нет


167

У меня возникли проблемы с удалением томов Docker с помощью Docker 1.9.1.

Я удалил все свои остановленные контейнеры так, чтобы 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-in-Docker, Swarm?). Используете ли вы какой-нибудь скрипт или инструмент для очистки ваших контейнеров?
thaJeztah

5
Эй, спасибо @thaJeztah, перезапустив демон Docker ( sudo service docker stopи sudo service docker start) очистил все эти тома-призраки для меня. Более того, похоже, что теперь я могу без проблем удалять тома с помощью команды docker rm -v. Единственная заметная разница в использовании заключается в том, что я использую docker-compose в Ubuntu 15.10. Я сообщу, смогу ли я когда-либо повторить эту проблему, но в противном случае будет достаточно простого перезапуска. Спасибо!
Tkwon123

2
даже после перезагрузки он по-прежнему говорит, что громкость
док-станции

10
Если вы используете docker compose, вы можете добавить -v к команде down, чтобы удалить тома.
Нильс Бек Нильсен

5
Я исправил это, остановив Docker, затем удалив тома из файловой системы и снова запустив Docker. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
Jfgrissom

Ответы:


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 - это файл интерпретатора вашей оболочки ( ~/.bashrcесли вы используете bash), и перезагрузить их через выполнение source ~/Xrc. Кроме того, вы можете просто скопировать и вставить их в консоль, а затем (независимо от варианта, который вы использовали ранее для подготовки функций) просто запустить:

armageddon

Это также полезно для обычной очистки Docker. Имейте в виду, что это также приведет к удалению ваших изображений, а не только ваших контейнеров (работающих или нет) и любых ваших томов.


3
На вопрос, docker volume rmкоманда терпела неудачу. Судя по комментариям, решение состоит в том, чтобы перезапустить демон docker для исправления счетчика ссылок.
BMitch

2
@BMitch, если вы внимательно прочитаете комментарии, это не решение для этого:even after reboot it still says docker volume is in use..
Дэвид Гонсалес Руис

1
Холмс, кажется, имеет другую проблему, и не тот, который разместил вопрос. Посмотрите на один комментарий выше.
BMitch

10
Gonsales, 👏 для названия функции, но оно пишетсяarmageddon
Джозеф Шиди

1
Это не решило мою проблему. Использование docker-compose down --volumesсделал хотя (как предложено @ Роберт К. Белл)
BiAiB

159

Возможно, объем был создан с помощью docker-compose? Если так, это должно быть удалено:

docker-compose down --volumes

Благодарим Нильса Бека Нильсена !


3
Это работает :) Хорошо отметить, что это также удаляет все контейнеры. Это может быть нежелательным, если вы изменили файлы в контейнере, которые не находятся в постоянном монтировании и не находятся в образе.
Александр Варвийк

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 клиента и демона должны быть как минимум 1.25, чтобы использовать эту команду. Используйте docker versionкоманду на клиенте, чтобы проверить версии API вашего клиента и демона.


по какой-то причине мне пришлось сделать это дважды, прежде чем это сработало.
мамлюк

1
Я должен был сделать «удаление системы Docker», а затем «том Docker тома имя_ тома». По какой-то причине удалите удаленные контейнеры, которые я уже удалил. спутать .
Мэтью

54

Объем может использоваться одним из остановленных контейнеров. Вы можете удалить такие контейнеры командой:

docker container prune

тогда вы можете удалить неиспользуемые тома

docker volume prune

1
это должен быть принятый ответ, не знаю, почему людям нравится такой ответ
Элгер

9

Пока тома связаны с контейнером (работающим или нет), их нельзя удалить.

Ты должен бежать

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

на каждом из работающих / не работающих контейнеров, на которых этот том мог быть установлен.

Если том смонтирован на каком-либо из контейнеров, вы должны увидеть его в разделе Mounts выходных данных команды inspect . Что-то вроде этого :-

"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
Для полезного ответа эта реакция должна быть расширена. Добавьте информацию о том, как это проверить.
Йерун Хейер

1
Бьюсь об заклад, docker container pruneдолжно быть достаточно в большинстве случаев.
х-юри

6

В настоящее время вы можете использовать то, что сейчас предлагает докер, для общей и более полной очистки:

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>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.