Докер використовується в об'ємі, але в ньому немає контейнерів Docker


166

У мене виникли проблеми з видаленням томів 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 використовує підрахунок посилань, щоб перевірити, чи все ще використовується гучність; це все робиться в пам'яті; це може бути помилка чи стан перегонів якось, що призвело до видалення контейнера, але лічильник не оновлювався. Перезапуск демона має вирішити це, але, так, можливо, десь є помилка. Чи є щось особливе у ваших налаштуваннях (наприклад, чи використовуєте ви докер-в-докер, Swarm?). Чи використовуєте ви якийсь сценарій чи інструмент для очищення контейнерів?
tJeztah

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

2
навіть після перезавантаження все ще йдеться про використання обсягу докера ..
holms

10
Якщо ви використовуєте docker compose, ви можете додати -v до команди down, щоб видалити томи.
Niels Bech Nielsen

5
Я вирішив це, зупинивши докер, потім видаливши томи з файлової системи та запустивши докер знову. 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

Це також корисно для загального прибирання Докера. Майте на увазі, що це також видалить ваші зображення, не тільки ваші контейнери (працюючі чи ні) та ваші томи будь-якого типу.


3
За запитання, docker volume rmкоманда провалилась. З коментарів, як видається, рішення - перезапустити демон докера, щоб виправити кількість посилань.
BMitch

2
@BMitch, якщо ви уважно прочитаєте коментарі, це не рішення для цього:even after reboot it still says docker volume is in use..
David González Ruiz

1
Схоже, у holms є інша проблема, а не та, яка поставила це питання. Подивіться один коментар вище цього.
BMitch

10
Гонси, 👏для назви функції, але написаноarmageddon
Джозеф Шеді

1
Це не вирішило моєї проблеми. Використання docker-compose down --volumesзробив хоч (як запропонував @ Rober K. Bell)
BiAiB

159

Можливо, обсяг був створений через docker-compose? Якщо це так, його слід видалити:

docker-compose down --volumes

Кредит Niels Bech Nielsen !


3
Це працює :) Добре зазначити, що це також видаляє всі контейнери. Це може бути небажаним, якщо ви змінили файли в контейнері, які не знаходяться на постійному кріпленні та не в зображенні.
Олександр Варвейк

58

Я досить новачок у Докер. Я прибирав деякий вихідний безладний тест і також не зміг видалити об'єм. Я зупинив усі запущені екземпляри, виконав 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 вашого клієнта та демона.


мені чомусь довелося це зробити двічі, перш ніж це спрацювало.
mameluc

1
Мені довелося зробити "docker system prune", а потім "docker volume rm volume_name". Чомусь видалені контейнери з чорносливом я вже видалив. розгублений .
Меттью Rideout

54

Об'єм може бути використаний одним із зупинених контейнерів. Ви можете видалити такі контейнери командою:

docker container prune

тоді ви можете видалити не використовувані томи

docker volume prune

1
це повинна бути прийнята відповідь, не знаю, чому людям подобається відповідь
Elger Mensonides

9

Поки об'єми пов'язані з контейнером (працює чи ні), їх неможливо видалити.

Ви повинні бігти

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

на кожному із запущених / не запущених контейнерів, на яких цей об'єм, можливо, був встановлений.

Якщо об'єм встановлено на будь-якому з контейнерів, ви повинні побачити його в розділі Монтажі на виході команди перевірити . Щось на зразок цього :-

"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

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.