Làm cách nào để xóa hình ảnh của Docker?


265

Tôi có những hình ảnh sau:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

và khi tôi cố gắng loại bỏ một trong số chúng, tôi nhận được:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

Làm thế nào tôi có thể loại bỏ chúng? Tại sao có xung đột như vậy?

Câu trả lời:


478

Để xóa tất cả các hình ảnh, sử dụng lệnh đã cho

docker rmi $(docker images -q)

Để xóa tất cả các container, sử dụng lệnh đã cho

docker rm $(docker ps -a -q)

Cảnh báo: Điều này sẽ phá hủy tất cả hình ảnh và container của bạn. Sẽ không thể khôi phục chúng!

Giải pháp này được cung cấp bởi Techoverflow.net .


17
Đơn giản và thẳng thắn. Ngoài ra bạn dưới đây lệnh để buộc loại bỏ hình ảnh. 'Docker rmi -f $ (hình ảnh
docker

37
Các cửa sổ tương đương với quyền hạn làdocker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot

1
Đầu tiên tôi sử dụng cmd trên @muheed Cách trả lời ( stackoverflow.com/a/30475249/2747020 ) để mở khóa xóa một số hình ảnh:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar

1
Windows Powershell cho các container dockerdocker ps -a -q | %{docker rm -f $_}
Dexter

1
Như @ alexyz78 ghi chú bên dưới, bây giờ bạn có thể sử dụng docker system prune. Vì vậy, để xóa sạch mọi thứ : docker kill $(docker ps -q)dừng các container theo sau docker system prune -asẽ xóa mọi thứ - xem stackoverflow.com/a/44309011/247708
Bharat

101

Lý do có thể: Lý do có thể là hình ảnh này hiện đang được sử dụng bởi một container đang chạy. Trong trường hợp như vậy, bạn có thể liệt kê các container đang chạy, dừng container có liên quan và sau đó xóa hình ảnh:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

Nếu bạn không thể tìm thấy container bằng docker ps, bạn có thể sử dụng nó để liệt kê tất cả các container đã thoát và loại bỏ chúng.

docker ps -a | grep 60afe4036d97
docker rm <containerid>

Lưu ý: Cẩn thận xóa tất cả các container đã thoát cùng một lúc trong trường hợp bạn sử dụng Volume-Onlycác container. Chúng ở trong Exittrạng thái, nhưng chứa dữ liệu hữu ích .


Trên thực tế, bạn sẽ nhận được một tin nhắn chỉ định rằng. Có lẽ một hình ảnh khác được dựa trên hình ảnh này? Trước tiên hãy thử xóa bất kỳ hình ảnh nào bạn tạo ra từ hình ảnh này.
qkrijger

12
Tôi đã có thể xóa hình ảnh bằng sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(nhờ github.com/dotcloud/docker/issues/3258 ) và sau đó vớisudo docker rmi 70c0e19168cf
alexyz78

2
Hãy cẩn thận xóa hình ảnh trong Exittrạng thái. Nếu bạn đang sử dụng các thùng chứa chỉ có khối lượng dữ liệu thì chúng không chạy.
aceofspades

1
awk can grep:awk '/Exit/ {print $1}'
Dwight Spencer

Lệnh của bạn ném này Error response from daemon: No such container: .... Thật khó để nói cái gì phải thay thế, và tôi nên thay thế cái gì. Không sử dụng...
Felo Vilches

60

Lý do cho lỗi là mặc dù hình ảnh không có bất kỳ thẻ nào, vẫn tồn tại một vùng chứa được tạo trên hình ảnh đó có thể ở exitedtrạng thái. Vì vậy, bạn cần đảm bảo rằng bạn đã dừng và xóa tất cả các container được tạo trên những hình ảnh đó. Lệnh sau giúp bạn loại bỏ tất cả các container không chạy:

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

Bây giờ điều này loại bỏ tất cả các <none>hình ảnh không trung gian lơ lửng :

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

Lưu ý: Để dừng tất cả các container đang chạy:

docker stop `docker ps -q`

1
Cảm ơn bạn vì điều này, tôi thấy đây là cách thực hiện sạch nhất.
Joseph Sawyer

7
Hãy cẩn thận nếu bạn có bộ chứa khối lượng dữ liệu vì chúng có "status = exited". Điều này có nghĩa là bạn sẽ mất tất cả dữ liệu của bạn.
Johan

19

Hình ảnh hiện có thể được sử dụng bởi một container đang chạy, vì vậy trước tiên bạn phải dừng và xóa (các) container.

docker stop <container-name>
docker rm <container-id>

Sau đó, bạn có thể thử xóa hình ảnh:

docker rmi <image-id>

Bạn phải chắc chắn rằng hình ảnh này không phụ thuộc vào hình ảnh khác (nếu không bạn phải xóa chúng trước).

Tôi đã có một trường hợp kỳ lạ trong đó tôi không còn container nào còn sống ( docker ps -akhông trả lại gì) nhưng tôi không thể xóa hình ảnh và sự phụ thuộc vào hình ảnh của nó.

Để giải quyết những trường hợp đặc biệt này, bạn có thể buộc xóa hình ảnh bằng cách này:

docker rmi -f <image-id>

19

Trong Bash:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

Điều này sẽ xóa tất cả các hình ảnh có tên "<none>". Tôi tìm thấy những hình ảnh dư thừa.


3
Điều này không trả lời câu hỏi, nhưng nó vẫn rất hữu ích. Cảm ơn.
binwiederhier

5
làm cho lệnh này trở nên đơn giản docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi, nó có thể cần sự sudocho phép
Larry Cai

15

Tôi tìm thấy câu trả lời trong lệnh này:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

Tôi gặp vấn đề với bạn khi tôi xóa một số hình ảnh đang được sử dụng và tôi không nhận ra (sử dụng docker ps -a).


9

Kể từ Docker ver. 1.13.0 (tháng 1 năm 2017) có system prunelệnh:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage

7

Ngoài câu trả lời của Sunny:

Để xóa tất cả hình ảnh trên máy Windows (với Docker cho Windows) trong cửa sổ PowerShell, hãy làm:

docker images -q | %{docker rmi -f $_}

Để xóa tất cả các vùng chứa trên máy Windows (với Docker cho Windows) trong cửa sổ PowerShell, hãy làm:

docker ps -a -q | %{docker rm -f $_}

6

Đầu tiên, loại bỏ tất cả các container bằng lệnh sau

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

Sau đó, xóa hình ảnh bằng ID của nó bằng lệnh sau

sudo docker rmi <image-id>

Điều đáng chú ý trong trường hợp điều này không rõ ràng với một số người rằng điều này sẽ loại bỏ tất cả các container Docker đang chạy.
Michael Mior


4

Hủy bỏ tất cả các container

docker ps -q -a | xargs docker rm

Buộc xóa tất cả các hình ảnh Docker

docker rmi -f $(docker images -f dangling=true -q)

4

Đơn giản là bạn có thể aadd --forceở cuối lệnh. Giống:

sudo docker rmi <docker_image_id> --force

Để làm cho nó thông minh hơn, bạn có thể thêm như:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

Ở đây trong docker ps$ 1 là cột đầu tiên, tức là ID container Docker.

docker images$ 3 là cột thứ ba, tức là ID hình ảnh Docker.


3

Phiên bản nhỏ gọn nhất của lệnh để xóa tất cả các hình ảnh chưa được đánh dấu là:

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')

3

Để xóa một số hình ảnh Docker, bạn phải thực hiện lệnh sau:

$ docker rmi <docker_image_id>

Vì vậy, để xóa tất cả các hình ảnh Docker, bạn có thể thực hiện lệnh sau:

$ docker rmi $(docker images -q)

Bây giờ, nếu bạn muốn xóa tất cả các hình ảnh Docker (bao gồm cả hình ảnh đang sử dụng), bạn có thể thêm cờ -f, ví dụ:

$ docker rmi -f $(docker images -q)

3

Sử dụng

docker image prune -all

hoặc là

docker image prune -a

Xóa tất cả hình ảnh lơ lửng. Nếu -ađược chỉ định, nó cũng sẽ xóa tất cả các hình ảnh không được tham chiếu bởi bất kỳ container nào.

Lưu ý: Bạn được nhắc xác nhận trước khi cắt bỏ bất cứ điều gì, nhưng bạn không được hiển thị một danh sách những gì sẽ có khả năng bị xóa. Ngoài ra, docker image lskhông hỗ trợ lọc âm, nên rất khó dự đoán hình ảnh nào sẽ thực sự bị xóa.

Như đã nêu trong tài liệu của Docker cho việc cắt tỉa .


1

Nếu bạn muốn tự động / định kỳ dọn sạch các container đã thoát và xóa các hình ảnh và khối lượng không được sử dụng bởi một container đang chạy, bạn có thể tải xuống hình ảnh Docker meltwater/docker-cleanup.

Bằng cách đó bạn không cần phải dọn dẹp bằng tay.

Chỉ cần chạy:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

Nó sẽ chạy cứ sau 30 phút (hoặc tuy nhiên bạn đặt nó lâu bằng tùy chọn DELAY_TIME = 1800) và dọn sạch các thùng chứa và hình ảnh đã thoát.

Thêm chi tiết: https://github.com/meltwater/docker-cleanup/blob/master/README.md


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.