Docker đang được sử dụng, nhưng không có bất kỳ container Docker nào


166

Tôi đã gặp vấn đề với việc loại bỏ khối lượng Docker với Docker 1.9.1.

Tôi đã loại bỏ tất cả các container đã dừng để docker ps -atrả lại sản phẩm nào.

Khi tôi sử dụng docker volume ls, tôi được cung cấp một loạt các container Docker:

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

Vì không có tập nào trong số này chứa bất cứ thứ gì quan trọng, tôi cố gắng thanh lọc tất cả các tập với docker volume rm $(docker volume ls -q).

Trong quá trình này, phần lớn được loại bỏ, nhưng tôi nhận lại:

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

Đối với một phần lớn của họ. Nếu tôi không có bất kỳ container nào tồn tại ở nơi đầu tiên, làm thế nào những khối lượng này được sử dụng?


7
docker sử dụng đếm tham chiếu để kiểm tra xem một khối lượng vẫn đang được sử dụng; tất cả điều này được thực hiện trong bộ nhớ; đây có thể là một lỗi hoặc một điều kiện cuộc đua bằng cách nào đó, dẫn đến việc container bị xóa, nhưng bộ đếm không được cập nhật. Việc khởi động lại daemon sẽ giải quyết vấn đề này, nhưng, vâng, có thể có lỗi ở đâu đó. Có điều gì đặc biệt trong thiết lập của bạn (ví dụ: Bạn đang sử dụng docker-in-docker, Swarm?). Bạn có sử dụng một số tập lệnh hoặc công cụ để dọn dẹp các thùng chứa của bạn?
thaJeztah

5
Xin cảm ơn @thaJeztah khởi động lại Docker daemon ( sudo service docker stopsudo service docker start) đã xóa tất cả các khối lượng ma này cho tôi. Hơn nữa, có vẻ như bây giờ tôi có thể loại bỏ âm lượng mà không gặp vấn đề gì khi sử dụng lệnh docker rm -v. Chỉ có sự khác biệt đáng chú ý trong cách sử dụng là tôi đã sử dụng docker-compose trên Ubuntu 15.10. Tôi sẽ báo cáo lại nếu tôi có thể sao chép vấn đề này nhưng nếu không, có vẻ như việc khởi động lại đơn giản sẽ đủ. Cảm ơn!
Tkwon123

2
ngay cả sau khi khởi động lại, nó vẫn cho biết khối lượng docker đang được sử dụng ..
holms

10
Nếu bạn sử dụng soạn thảo docker, bạn có thể thêm -v vào lệnh down, để loại bỏ các ổ đĩa.
Niels Bech Nielsen

5
Tôi đã sửa lỗi này bằng cách dừng docker sau đó xóa các ổ đĩa khỏi hệ thống tập tin và bắt đầu lại docker. service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom

Câu trả lời:


169

Bạn có thể sử dụng các chức năng này để xóa một cách tàn nhẫn mọi thứ liên quan đến 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)
}

Bạn có thể thêm chúng vào ~/Xrctệp của mình , trong đó X là trình thông dịch shell của bạn ( ~/.bashrcnếu bạn đang sử dụng tệp bash) và tải lại chúng thông qua thực thi source ~/Xrc. Ngoài ra, bạn chỉ có thể sao chép dán chúng vào bàn điều khiển và sau đó (bất kể tùy chọn bạn đã thực hiện trước đó để sẵn sàng các chức năng) chỉ cần chạy:

armageddon

Nó cũng hữu ích cho việc dọn dẹp Docker nói chung. Hãy nhớ rằng điều này cũng sẽ xóa hình ảnh của bạn, không chỉ các thùng chứa của bạn (có chạy hay không) và khối lượng của bạn dưới bất kỳ hình thức nào.


3
Theo câu hỏi, docker volume rmlệnh đã thất bại. Từ các bình luận, giải pháp có vẻ là khởi động lại trình nền docker để sửa số tham chiếu.
BMitch

2
@BMitch nếu bạn đọc kỹ thông qua các bình luận, đó không phải là giải pháp cho việc này:even after reboot it still says docker volume is in use..
David González Ruiz

1
holms dường như có một vấn đề khác và không phải là vấn đề đăng câu hỏi. Tra cứu một bình luận ở trên đó.
BMitch

10
Các gonsales, cho tên hàm nhưng được đánh vầnarmageddon
Joseph Sheedy

1
Điều này đã không giải quyết vấn đề của tôi. Sử dụng docker-compose down --volumesđã làm (mặc dù được đề xuất bởi @Robert K. Bell)
BiAiB

159

Có lẽ khối lượng được tạo ra thông qua docker-compose? Nếu vậy, nó sẽ bị xóa bởi:

docker-compose down --volumes

Tín dụng cho Niels Bech Nielsen !


3
Điều này hoạt động :) Thật tốt khi lưu ý rằng điều này cũng loại bỏ tất cả các container. Điều này có thể không mong muốn nếu bạn thay đổi các tệp trong vùng chứa không gắn kết vĩnh viễn và không có trong hình ảnh.
Alexander Varwijk

58

Tôi còn khá mới với Docker. Tôi đang dọn dẹp một số mớ thử nghiệm ban đầu và cũng không thể xóa một tập. Tôi đã dừng tất cả các phiên bản đang chạy, thực hiện một docker rmi -f $(docker image ls -q), nhưng vẫn nhận được Error response from daemon: unable to remove volume: remove uuid: volume is in use.

Tôi đã làm một docker system prunevà nó đã dọn sạch những gì cần thiết để loại bỏ tập cuối cùng:

[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

Cả API máy khách và daemon đều phải có ít nhất 1,25 để sử dụng lệnh này. Sử dụng docker versionlệnh trên máy khách để kiểm tra các phiên bản API máy khách và daemon của bạn.


vì một số lý do tôi đã phải làm điều này hai lần trước khi nó hoạt động.
mameluc

1
Tôi đã phải thực hiện "docker system prune" và sau đó là "docker volume rm volume_name". Vì một số lý do, prune đã xóa các container tôi đã xóa. bối rối .
Matthew Rideout

54

Khối lượng có thể được sử dụng bởi một trong những container đã dừng. Bạn có thể loại bỏ các container như vậy bằng lệnh:

docker container prune

sau đó bạn có thể loại bỏ khối lượng không sử dụng

docker volume prune

1
đây phải là câu trả lời được chấp nhận, dunno tại sao mọi người thích câu trả lời được đưa ra
Elger Mensonides

9

Miễn là khối lượng được liên kết với một container (có chạy hay không), chúng không thể được gỡ bỏ.

Bạn phải chạy

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

trên mỗi thùng chứa đang chạy / không chạy, nơi khối lượng này có thể đã được gắn vào.

Nếu âm lượng được gắn vào bất kỳ một trong các thùng chứa, bạn sẽ thấy nó trong phần Gắn kết của đầu ra lệnh kiểm tra . Một cái gì đó như thế này: -

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

Sau khi tìm ra (các) thùng chứa có trách nhiệm, hãy sử dụng: -

docker rm -f container-1 container-2 ...container-n trong trường hợp chạy container

docker rm container-1 container-2 ...container-n trong trường hợp container không chạy

để loại bỏ hoàn toàn các container khỏi máy chủ.

Sau đó thử xóa âm lượng bằng lệnh: -

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


1
Đối với một câu trả lời hữu ích, phản ứng này cần phải được mở rộng. Thêm thông tin về cách kiểm tra này.
Jeroen Heier

1
Tôi đặt cược docker container prunephải là đủ trong hầu hết các trường hợp.
x-yuri

6

Hiện tại bạn có thể sử dụng những gì docker cung cấp ngay bây giờ để làm sạch chung và hoàn thiện hơn:

docker system prune

Ngoài ra, để xóa mọi container bị dừng và tất cả các hình ảnh không sử dụng (không chỉ hình ảnh lơ lửng), hãy thêm -acờ vào lệnh:

docker system prune -a

3

Tôi khá chắc chắn rằng những khối lượng đó thực sự được gắn trên hệ thống của bạn. Nhìn vào / Proc / mounts và bạn sẽ thấy chúng ở đó. Bạn có thể sẽ cần sudo umount <path>hoặc sudo umount -f -n <path>. Bạn sẽ có thể có được đường dẫn được gắn kết trong / Proc / mounts hoặc thông quadocker volume inspect


-3

Bạn nên gõ lệnh này bằng cờ -f (lực lượng):

sudo docker volume rm -f <VOLUME NAME>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.