Hình ảnh lơ lửng là gì và hình ảnh không sử dụng là gì?


155

Trong tài liệu docker của tỉa hình ảnh docker , có thể sử dụng cờ -a để

Xóa tất cả các hình ảnh không sử dụng, không chỉ những hình ảnh lơ lửng

và sau đó

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

Ai đó có thể giải thích cho tôi những hình ảnh lơ lửng là gì và sự khác biệt giữa hình ảnh lơ lửng và không sử dụng?


mặc dù hình ảnh docker prune (không có -a) thực hiện chính xác như vậy
herm

Không thành công khi bạn sử dụng trong jenkins, chúng tôi sẽ mất bản sao lưu docker trong sản xuất nếu chúng tôi phụ thuộc vào bộ đệm hình ảnh docker. prunekhông được giới thiệu trong sản xuất /
Jinna Balu

Câu trả lời:


153

Một hình ảnh không được sử dụng có nghĩa là nó chưa được chỉ định hoặc sử dụng trong một container. Ví dụ: khi chạy docker ps -a- nó sẽ liệt kê tất cả các container đã thoát và hiện đang chạy của bạn. Bất kỳ hình ảnh nào được hiển thị đang được sử dụng bên trong bất kỳ vùng chứa nào đều là "hình ảnh đã sử dụng".

Mặt khác, một hình ảnh lơ lửng chỉ có nghĩa là bạn đã tạo ra bản dựng mới của hình ảnh, nhưng nó không được đặt tên mới. Vì vậy, những hình ảnh cũ bạn đã trở thành "hình ảnh lơ lửng". Những hình ảnh cũ đó là những hình ảnh không được đánh dấu và hiển thị " <none>" trên tên của nó khi bạn chạy docker images.

Khi chạy docker system prune -a, nó sẽ loại bỏ cả hình ảnh không sử dụng và lơ lửng. Do đó, bất kỳ hình ảnh nào đang được sử dụng trong một thùng chứa, cho dù chúng đã thoát hoặc đang chạy, sẽ KHÔNG bị ảnh hưởng.


Theo tài liệu khi chạy docker prune mà không -a chỉ xóa hình ảnh lơ lửng. -a sẽ đảm bảo rằng những hình ảnh không sử dụng cũng bị xóa phải không? docs.docker.com/engine/reference/commandline/system_prune
Herm


1
Rất thú vị. Vì vậy, một hình ảnh lơ lửng có thể được sử dụng bởi một container. Lưu ý: Docker cảnh báo bạn nếu có bất kỳ container nào đang sử dụng những hình ảnh không được đánh dấu này.
Herm

7
docker system prune --all --filter "until=24h"giữ lại những hình ảnh gần đây
Harry Moreno

1
Theo docs.docker.com/engine/reference/commandline/system_prune/, cũng docker system prune -a loại bỏ các container bị dừng. Vì vậy, nó cũng nên loại bỏ hình ảnh liên quan đến các container đã thoát, phải không?
lfk

41

Cách an toàn nhất và dễ nhất để dọn dẹp hình ảnh lủng lẳng

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Docker hình ảnh bao gồm nhiều lớp. Hình ảnh lơ lửng, là các lớp không có mối quan hệ với bất kỳ hình ảnh được gắn thẻ. Họ không còn phục vụ một mục đích và tiêu thụ không gian đĩa.

Lưu ý: Tôi khuyên bạn không nên sử dụng prunetrong sản xuất, vì docker system prune -asẽ xóa tất cả các hình ảnh không được tham chiếu bởi container, do đó chúng tôi không thể quay lại bản phát hành trước.

Để liệt kê hình ảnh lơ lửng bằng cách thêm cờ bộ lọc, -fvới giá trị dangling=truedocker images.

Danh sách hình ảnh lủng lẳng

docker images -f dangling=true

Xóa hình ảnh lơ lửng

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

HOẶC LÀ

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Khi chúng tôi chạy bất kỳ công việc định kỳ nào để xóa công cụ lơ lửng, hãy sử dụng công cụ trên để đảm bảo công việc chạy thành công. Giống như trong Jenkins nếu chúng ta điều hành một công việc theo phong cách miễn phí với công việc ủy ​​thác sẽ không bao giờ thất bại ngay cả khi không có công cụ lơ lửng nào tồn tại trong máy.

Đây là cách an toàn và dễ dàng nhất để dọn dẹp hình ảnh lơ lửng và lấy lại không gian đĩa của chúng tôi để sử dụng.


2
Điều gì về cắt tỉa hình ảnh docker? Tài liệu nói: "Xóa tất cả hình ảnh lơ lửng. Nếu -a được chỉ định, cũng sẽ xóa tất cả hình ảnh không được tham chiếu bởi bất kỳ vùng chứa nào." docs.docker.com/engine/reference/commandline/image_prune/...
Herm

2
@herm, từ cuối trang bạn đã tham chiếu "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ị danh sách những gì có khả năng sẽ bị xóa". Tôi nghĩ rằng điểm trong câu trả lời này là bạn có thể nhận được một danh sách các hình ảnh lơ lửng, sau đó bạn xác định rõ ràng sẽ bị xóa, trái ngược với việc xóa mù tất cả các hình ảnh lơ lửng bằng cách cắt tỉa.
bzier

Các hình ảnh có tên và thẻ như không có trong docker imagesđược treo lủng lẳng. Làm thế nào để kiểm tra kích thước của chúng? Ngoài ra, hình ảnh có tên và thẻ là không có trong docker images -ahình ảnh trung gian. Họ có thể bị xóa và làm thế nào để kiểm tra kích thước của họ?
biến

17

Hình ảnh trong docker được tham chiếu bởi một bản tóm tắt sha256, thường được gọi là id hình ảnh. Thông báo đó là tất cả những gì bạn cần cho hình ảnh tồn tại trên máy chủ docker. Thông thường, bạn sẽ có các thẻ trỏ đến các bản tóm tắt này, ví dụ: thẻ busybox: các điểm hiện tại mới nhất cho id hình ảnh c49578c523 ... trên hệ thống của tôi. Nhiều thẻ có thể trỏ đến cùng một hình ảnh và bất kỳ thẻ nào cũng có thể được thay đổi để trỏ đến một id khác, ví dụ: khi bạn kéo một bản sao mới của busybox: mới nhất hoặc xây dựng một phiên bản mới của hình ảnh ứng dụng của bạn.

Hình ảnh lơ lửng là hình ảnh không có thẻ và không có hình ảnh con (ví dụ: hình ảnh cũ sử dụng phiên bản khác FROM busybox:latest), chỉ vào chúng. Họ có thể đã có một thẻ chỉ vào họ trước đó và thẻ đó sau đó đã thay đổi. Hoặc họ có thể chưa bao giờ có thẻ (ví dụ: đầu ra của một docker buildmà không bao gồm tùy chọn thẻ). Chúng thường an toàn để xóa miễn là không có container nào đang chạy tham chiếu id hình ảnh cũ. Lý do chính để giữ chúng xung quanh là để xây dựng mục đích lưu trữ.

Ngoài ra, bạn có thể đã tải xuống những hình ảnh mà hiện tại bạn không sử dụng bởi các container (bao gồm cả các container bị dừng). Chúng hoàn toàn khác với hình ảnh lơ lửng và có thể an toàn để xóa miễn là bạn không có kế hoạch sử dụng chúng trong tương lai hoặc không ngại tải xuống một bản sao khác khi bạn cần chúng.


Trong khi một bản dựng docker đang chạy (quá trình nó tạo các lớp và các ứng cử viên có thể cho các hình ảnh lơ lửng trong tương lai), trong một cửa sổ mới nếu tôi chạy cắt tỉa hình ảnh docker, thì nó có ảnh hưởng đến tiến trình xây dựng theo bất kỳ cách nào không?
biến

@variable có thể có một điều kiện cuộc đua trong đó, nhưng thông thường, container đang chạy cho bước xây dựng sẽ dẫn đến hình ảnh được xác định là đang sử dụng. Điều tồi tệ nhất có thể xảy ra là việc cắt tỉa gây ra lỗi hoặc quá trình xây dựng và bạn phải chạy lại nó. Tôi sẽ xem xét liệu bạn có thể giới hạn việc cắt tỉa của mình để tránh các hình ảnh bạn hiện đang sử dụng để xây dựng hay không vì việc cắt tỉa thành công sẽ dẫn đến các bản dựng trong tương lai cần tải xuống lại hình ảnh.
BMitch

Các hình ảnh trung gian (những hình ảnh không có tên / thẻ hiển thị khi chạy docker images -a) cũng được gọi là hình ảnh lơ lửng? Họ có được xóa với tỉa hình ảnh docker?
biến

Tôi không còn những thứ đó trong môi trường của mình nữa (sử dụng buildkit ở đây), vì vậy tôi khuyên bạn nên thử bản thân trong môi trường phòng thí nghiệm để xem điều gì xảy ra.
BMitch

Điều đó nói rằng, xóa các "hình ảnh" không được đánh dấu khỏi các giai đoạn trung gian là khá vô nghĩa, trừ khi bạn xóa hình ảnh được gắn thẻ cuối cùng, tất cả các lớp được sử dụng lại trong một hình ảnh sau đó và không thể xóa. Nếu bạn xóa chúng, bạn sẽ phá hủy bộ đệm xây dựng của mình và khiến tất cả các hình ảnh trong tương lai mất nhiều thời gian hơn để xây dựng và không gian đĩa để lưu trữ.
BMitch

5

Hình ảnh lơ lửng là các lớp không có mối quan hệ với bất kỳ hình ảnh được gắn thẻ. Họ không còn phục vụ một mục đích và tiêu thụ không gian đĩa.

Một hình ảnh không được sử dụng là một hình ảnh chưa được chỉ định hoặc sử dụng trong một container.

Danh sách hình ảnh lủng lẳng

docker images -f dangling=true

3

hình ảnh lơ lửng là hình ảnh không được đánh dấu. Lệnh sau đưa ra danh sách các hình ảnh lơ lửng.

docker images --filter "dangling=true"

docker image prune xóa tất cả các hình ảnh lơ lửng.

Hình ảnh không sử dụng là hình ảnh có thẻ nhưng hiện không được sử dụng làm vật chứa. Bạn có thể hoặc không cần nó trong tương lai.

docker image prune -a xóa tất cả các hình ảnh lơ lửng cũng như không sử dụng.

Bạn thường không muốn xóa tất cả các hình ảnh không sử dụng cho đến một lúc nào đó. Do đó tốt hơn là loại bỏ bằng bộ lọc.

docker image prune -f --filter "until=6h"


1) docker image prune -a -f --filter "until=6h"Cũng xóa hình ảnh lơ lửng?
biến

2) Trong lệnh cuối cùng của bạn, bạn đề cập docker image prune -f --filter "until=6h"- vì không có -a - vậy thì tại sao nó lại xóa những hình ảnh không sử dụng?
biến

0

Tôi đã thấy các lệnh (bí danh) hữu ích để xóa hình ảnh lơ lửng, lịch sự của andyneff tại đây: https://forums.docker.com/t/how-to-delete-cache/5753 :

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)' 
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)' 

Người đầu tiên làm sạch tất cả các hình ảnh lơ lửng. Điều này rất hữu ích để xóa hình ảnh trung gian còn sót lại từ nhiều bản dựng. Cái thứ hai là để loại bỏ các container đã dừng. Đây là những bí danh tôi sử dụng để bảo trì định kỳ

Nếu bạn muốn xóa TẤT CẢ bộ nhớ cache của mình, trước tiên bạn phải đảm bảo tất cả các vùng chứa bị dừng và xóa, vì bạn không thể xóa hình ảnh được sử dụng bởi một container. Một cái gì đó tương tự

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)

Điều này sẽ giết và loại bỏ tất cả các hình ảnh trong bộ nhớ cache của bạn.


0

Trong ảnh chụp màn hình, tên "không" là hình ảnh lơ lửng. Hình ảnh lơ lửng chỉ có nghĩa là bạn đã tạo bản dựng mới của hình ảnh, nhưng nó không được đặt tên mới. Vì vậy, những hình ảnh cũ bạn đã trở thành "hình ảnh lơ lửng". Những hình ảnh cũ đó là những hình ảnh không được đánh dấu và hiển thị "" trên tên của nó khi bạn chạy hình ảnh docker.

docker system prune -a, nó sẽ loại bỏ cả hình ảnh không sử dụng và lơ lửng. Do đó, bất kỳ hình ảnh nào đang được sử dụng trong một thùng chứa, cho dù chúng đã thoát hoặc đang chạy, sẽ KHÔNG bị ảnh hưởng.

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.