Docker sedang digunakan, tetapi tidak ada wadah Docker

166

Saya mengalami masalah dengan menghapus volume Docker dengan Docker 1.9.1.

Saya telah menghapus semua kontainer saya yang berhenti sehingga docker ps -akembali kosong.

Saat saya gunakan docker volume ls, saya diberikan sejumlah besar wadah Docker:

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

Karena tidak ada satu pun dari volume ini yang mengandung sesuatu yang penting, saya mencoba untuk membersihkan semua volume dengan docker volume rm $(docker volume ls -q).

Dalam prosesnya, mayoritas dihapus, tetapi saya kembali:

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

Untuk porsi yang cukup besar. Jika saya tidak memiliki wadah di tempat pertama, bagaimana volume ini digunakan?

Tkwon123
sumber
7
buruh pelabuhan menggunakan penghitungan referensi untuk memeriksa apakah suatu volume masih digunakan; ini semua dilakukan dalam memori; ini mungkin berupa bug atau kondisi ras, yang mengakibatkan kontainer dihapus, tetapi penghitung tidak diperbarui. Restart dari daemon harus menyelesaikan ini, tapi, ya mungkin ada bug di suatu tempat. Apakah ada sesuatu yang istimewa dalam pengaturan Anda (mis. Apakah Anda menggunakan docker-in-docker, Swarm?). Apakah Anda menggunakan beberapa skrip atau alat untuk membersihkan wadah Anda?
thaJeztah
5
Hai terima kasih @thaJeztah me-restart daemon Docker ( sudo service docker stopdan sudo service docker start) membersihkan semua volume hantu ini untukku. Selain itu, sepertinya saya sekarang dapat menghapus volume tanpa masalah menggunakan perintah docker rm -v. Satu-satunya perbedaan penting dalam penggunaan adalah saya telah menggunakan docker-compose di Ubuntu 15.10. Saya akan melaporkan kembali jika saya bisa meniru masalah ini, tetapi jika tidak, sepertinya restart sederhana sudah cukup. Terima kasih!
Tkwon123
2
bahkan setelah reboot masih dikatakan volume buruh pelabuhan sedang digunakan ..
holms
10
Jika Anda menggunakan komposisi buruh pelabuhan, Anda dapat menambahkan -v ke perintah ke bawah, untuk menghapus volume.
Niels Bech Nielsen
5
Saya memperbaiki ini dengan menghentikan buruh pelabuhan kemudian menghapus volume dari sistem file dan mulai buruh pelabuhan lagi. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom

Jawaban:

169

Anda dapat menggunakan fungsi-fungsi ini untuk menghapus secara brutal semua yang terkait dengan 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)
}

Anda bisa menambahkannya ke ~/Xrcfile Anda , di mana X adalah file shell interpreter Anda ( ~/.bashrcjika Anda menggunakan bash) dan memuatnya kembali melalui eksekusi source ~/Xrc. Selain itu, Anda bisa menyalinnya ke konsol dan setelahnya (terlepas dari opsi yang Anda ambil sebelum menjalankan fungsi) jalankan saja:

armageddon

Ini juga berguna untuk membersihkan Docker secara umum. Perlu diingat bahwa ini juga akan menghapus gambar Anda, tidak hanya wadah Anda (baik yang sedang berjalan atau tidak) dan volume Anda apa pun.

David González Ruiz
sumber
3
Per pertanyaan, docker volume rmperintah itu gagal. Dari komentar, solusinya adalah me-restart daemon buruh pelabuhan untuk memperbaiki jumlah referensi.
BMitch
2
@BMitch jika Anda membaca dengan seksama melalui komentar, itu bukan solusi untuk ini:even after reboot it still says docker volume is in use..
David González Ruiz
1
holms tampaknya memiliki masalah yang berbeda dan bukan yang memposting pertanyaan. Lihat satu komentar di atas itu.
BMitch
10
The gonsales, 👏untuk nama fungsi tetapi diejaarmageddon
Joseph Sheedy
1
Ini tidak menyelesaikan masalah saya. Menggunakan docker-compose down --volumesmelakukannya (seperti yang disarankan oleh @Robert K. Bell)
BiAiB
159

Mungkin volumenya dibuat melalui docker-compose? Jika demikian, itu harus dihapus dengan:

docker-compose down --volumes

Penghargaan untuk Niels Bech Nielsen !

Robert K. Bell
sumber
3
Ini bekerja :) Ini baik untuk dicatat bahwa ini juga menghilangkan semua wadah sendiri. Ini bisa tidak diinginkan jika Anda mengubah file di wadah yang tidak berada di mount permanen dan tidak di dalam gambar.
Alexander Varwijk
58

Saya cukup baru di Docker. Saya sedang membersihkan beberapa kekacauan pengujian awal dan tidak dapat menghapus volume juga. Saya telah menghentikan semua instance berjalan, melakukan docker rmi -f $(docker image ls -q), tetapi masih menerima Error response from daemon: unable to remove volume: remove uuid: volume is in use.

Saya melakukan docker system prunedan membersihkan apa yang diperlukan untuk menghapus volume terakhir:

[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 klien dan daemon harus memiliki setidaknya 1,25 untuk menggunakan perintah ini. Gunakan docker versionperintah pada klien untuk memeriksa versi API klien dan daemon Anda.

Benjamin West
sumber
untuk beberapa alasan saya harus melakukan ini dua kali sebelum berhasil.
mameluc
1
Saya harus melakukan "docker system prune" dan kemudian "docker volume rm volume_name". Untuk beberapa alasan, pangkas wadah yang sudah saya hapus. bingung .
Matthew Rideout
54

Volume dapat digunakan oleh salah satu kontainer yang berhenti. Anda dapat menghapus wadah tersebut dengan perintah:

docker container prune

maka Anda dapat menghapus volume yang tidak digunakan

docker volume prune
Ryabchenko Alexander
sumber
1
ini harus menjadi jawaban yang diterima, tidak tahu mengapa orang menyukai jawaban yang diberikan
Elger Mensonides
9

Selama volume dikaitkan dengan suatu wadah (berjalan atau tidak), mereka tidak dapat dihapus.

Anda harus berlari

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

pada masing-masing wadah berjalan / tidak berjalan di mana volume ini mungkin telah dipasang ke.

Jika volume dipasang ke salah satu wadah, Anda harus melihatnya di bagian Mounts dari output perintah inspeksi . Sesuatu seperti ini :-

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

Setelah mencari tahu wadah yang bertanggung jawab, gunakan: -

docker rm -f container-1 container-2 ...container-n dalam hal menjalankan wadah

docker rm container-1 container-2 ...container-n dalam hal wadah tidak berjalan

untuk benar-benar menghapus wadah dari mesin host.

Kemudian coba hapus volume menggunakan perintah: -

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

Supreeth Padavala
sumber
1
Untuk jawaban yang bermanfaat, reaksi ini perlu diperpanjang. Tambahkan informasi tentang cara memeriksa ini.
Jeroen Heier
1
Saya bertaruh docker container prunepasti cukup dalam banyak kasus.
x-yuri
6

Saat ini Anda dapat menggunakan apa yang ditawarkan buruh pelabuhan sekarang untuk pembersihan umum dan lebih lengkap:

docker system prune

Untuk menghapus wadah yang terhenti dan semua gambar yang tidak digunakan (tidak hanya menggantung gambar), tambahkan tanda -abendera ke perintah:

docker system prune -a
shackra
sumber
3

Saya cukup yakin bahwa volume itu sebenarnya sudah terpasang di sistem Anda. Lihat di / proc / mounts dan Anda akan melihatnya di sana. Anda mungkin perlu sudo umount <path>atau sudo umount -f -n <path>. Anda harus bisa mendapatkan jalur yang terpasang baik di / proc / mounts atau melaluidocker volume inspect

Jiri Klouda
sumber
-3

Anda harus mengetik perintah ini dengan flag -f (force):

sudo docker volume rm -f <VOLUME NAME>

Julia
sumber