Làm thế nào để loại bỏ các container Docker cũ


1235

Câu hỏi này có liên quan đến Tôi có nên lo lắng về các container Docker thừa, không chạy không? .

Tôi đang tự hỏi làm thế nào để loại bỏ các container cũ. Việc docker rm 3e552code34acho phép bạn loại bỏ một cái duy nhất, nhưng tôi đã có rất nhiều. docker rm --helpkhông cung cấp tùy chọn lựa chọn (như tất cả hoặc theo tên hình ảnh).

Có lẽ có một thư mục trong đó các thùng chứa này được lưu trữ nơi tôi có thể xóa chúng dễ dàng bằng tay?


21
Bạn cũng nên xem xét việc làm sạch khối lượng docker mồ côi. Tôi thường thấy rằng chúng tiêu thụ nhiều không gian hơn nhiều so với các container cũ và hình ảnh cũ. Kịch bản tốt để loại bỏ khối lượng docker mồ côi có sẵn tại: github.com/chadoe/docker-cleanup-volume .
Nemanja Trifunovic

Có lẽ github.com/chadoe/docker-cleanup-volume có thể giúp bạn.
Mihai8

Bạn cũng có thể sử dụng docker runvới --rmcờ sẽ làm cho vùng chứa phù du, xóa tất cả các tệp chứa sau khi chạy.
Gordon

12
Với docker 1.13 (Q4 2016), bạn cũng có thể xem xét docker system prunelệnh mới . Xem câu trả lời của tôi dưới đây .
VonC

1
Sử dụng công cụ quản lý docker Portainer Chúng tôi có thể quản lý all the old containers, non using volumes and imagesbằng cách sử dụng công cụ này Đó là UI quản lý đơn giản cho các docker Please refer my update below on how to deploy the application
Anish Varghese

Câu trả lời:


1460

Kể từ Docker 1.13.x, bạn có thể sử dụng Docker container prune :

docker container prune

Điều này sẽ loại bỏ tất cả các container bị dừng và sẽ hoạt động trên tất cả các nền tảng theo cùng một cách.

Ngoài ra còn có một hệ thống Docker cắt tỉa :

docker system prune

sẽ dọn sạch tất cả các container, mạng, hình ảnh không sử dụng (cả lơ lửng và không được kiểm tra) và tùy chọn, khối lượng, trong một lệnh.


Đối với các phiên bản Docker cũ hơn, bạn có thể xâu chuỗi các lệnh Docker cùng với các lệnh Unix khác để có được những gì bạn cần. Dưới đây là một ví dụ về cách dọn sạch các container cũ đã được vài tuần tuổi:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Để cung cấp tín dụng, khi đến hạn, ví dụ này là từ https://twitter.com/jpetazzo/status/347431091415703552 .


92
Lệnh tương tự để xóa tất cả các hình ảnh chưa được đánh dấu: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj

7
@ MichelMüller khi xây dựng hình ảnh từ dockerfile, bạn có thể chỉ định -rmtùy chọn xóa các thùng chứa trung gian sau khi xây dựng thành công.
Freek Kalter

3
@ MichelMüller các hình ảnh là những gì được sử dụng cho bộ nhớ đệm, vì vậy việc loại bỏ các thùng chứa sẽ không ảnh hưởng đến điều đó.
Ken Cochrane

7
Nếu bạn muốn sử dụng awk cho điều này, hãy xem xét lệnh này nếu bạn muốn làm rm tất cả các container bị dừng (không có lỗi vì dòng đầu tiên):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi

3
Đây phải là lệnh được cập nhật để xóa hình ảnh chưa được đánh dấudocker rmi $(docker images -q -f dangling=true)
Ghjnut

626

Một phương pháp khác, mà tôi đã nhận được từ Guillaume J. Charmes (tín dụng khi đến hạn):

docker rm `docker ps --no-trunc -aq`

sẽ loại bỏ tất cả các container một cách thanh lịch.

Và bởi Bartosz Bilicki, cho Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Đối với PowerShell:

docker rm @(docker ps -aq)

Một bản cập nhật với Docker 1.13 (Q4 2016), ghi có vào VonC ( sau này trong chuỗi này ):

docker system prune sẽ xóa TẤT CẢ dữ liệu không sử dụng (nghĩa là theo thứ tự: container bị dừng, khối lượng không có container và hình ảnh không có container).

Xem PR 26108cam kết 86de7c0 , đang giới thiệu một vài lệnh mới để giúp tạo thuận lợi cho việc hiển thị bao nhiêu không gian dữ liệu daemon Docker đang chiếm trên đĩa và cho phép dễ dàng dọn sạch phần thừa "không cần thiết".

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

11
điều này bằng cách nào đó không làm việc cho tôi, nhưng docker ps -a -q | xargs docker rmhoạt động, (có thể cần thiết)
FUD

86
những gì về docker rm $(docker ps -a -q)?
qkrijger

8
@qkrijger, điều này không thay đổi bất cứ điều gì từ câu trả lời ban đầu của bạn, ngoại trừ việc thêm bashism. Vấn đề là tràn dòng lệnh. biến thể xargs đối phó với nó một cách tốt đẹp. Tôi cũng sẽ thêm --no-trunk vào docker ps để tránh xung đột id (không chắc).
Ihor Kaharlichenko

8
lưu ý nếu bạn sử dụng bộ chứa chỉ có dữ liệu, nó cũng sẽ loại bỏ chúng
Dzung Nguyen

4
Tôi không thấy vấn đề --no-truncdocker rmdù sao cũng không cần ID đầy đủ.
Pithikos

411

Cập nhật câu trả lời Sử dụng docker system prunehoặc docker container prunengay bây giờ. Xem câu trả lời cập nhật của VonC .

Câu trả lời trước Soạn một số gợi ý khác nhau ở trên, cách thanh lịch nhất để loại bỏ tất cả các container không chạy dường như là:

docker rm $(docker ps -q -f status=exited)

  • -q chỉ in các id container (không có tiêu đề cột)
  • -f cho phép bạn lọc danh sách các container được in (trong trường hợp này chúng tôi đang lọc để chỉ hiển thị các container đã thoát)

7
Đây phải là câu trả lời chính xác vì nó dựa vào docker để cho bạn biết những container nào không còn được sử dụng, thay vì giả sử định dạng đầu ra văn bản của $ (hình ảnh docker) sẽ không thay đổi. Điểm thưởng cho sinh sản chỉ một quá trình bổ sung thay vì hai.
eury nhịpia

18
Bạn có thể muốn thêm -vđể tránh khối lượng lơ lửng : docker rm -v $(docker ps -q -f status=exited). Xem docs.docker.com/userguide/dockervolume/ trên để biết chi tiết về khối lượng lơ lửng.
rluba

@rluba rõ ràng trong Docker 1.9 sẽ có một api âm lượng riêng để xử lý vấn đề đó. github.com/docker/docker/pull/14242
Ryan Walls

một bí danh có thể có ích:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung

Không giống như câu trả lời được đánh dấu là chính xác, câu trả lời @RyanWalls hoạt động trên OSX cũng như ngắn gọn hơn.
Ray

255

Cách chính thức là:

docker rm `docker ps -aq`

Các nhà bảo trì Docker đã chỉ ra rằng sẽ không có lệnh nào cho việc này - và bạn soạn các lệnh như thế:

Chúng tôi đã thảo luận điều này trước đây và thích người dùng sử dụng dòng trên mà không phải thêm mã bổ sung vào Docker.


6
Đây là một giải pháp tồi, bởi vì nó cũng sẽ xóa các thùng chứa.
Sobrique

8
"Container lưu trữ" nghĩa là gì? Nếu bạn có nghĩa là các thùng chứa dữ liệu mà trước đây từng được sử dụng để giữ các tham chiếu đến khối lượng dữ liệu, thì chúng không còn cần thiết vì có sẵn các docker volumetiểu ban và các khối lượng được đặt tên.
L0j1k

Lưu ý rằng điều này sẽ không hoạt động trong Windows Powershell. Vì thế, đây là một giải pháp tốt hơn: stackoverflow.com/a/23674294/1150683
Bram Vanroy

@Sobrique Nếu bạn không phản ứng, ít nhất bạn nên xóa bình luận của mình, nó gần như hoàn toàn và vô nghĩa.
peterh - Tái lập Monica

128

Với Docker 1.13 (Q4 2016), giờ đây bạn có:

docker system prune -a sẽ xóa TẤT CẢ dữ liệu không sử dụng (nghĩa là theo thứ tự: container bị dừng, khối lượng không có container và hình ảnh không có container).

docker system prunekhông có -a sẽ xóa (đối với hình ảnh) chỉ hình ảnh lơ lửng hoặc hình ảnh không có thẻ, như nhận xét của smilebomb .

Xem PR 26108cam kết 86de7c0 , đang giới thiệu một vài lệnh mới để giúp tạo thuận lợi cho việc hiển thị bao nhiêu không gian dữ liệu daemon Docker đang chiếm trên đĩa và cho phép dễ dàng dọn sạch phần thừa "không cần thiết".

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Như bình luận của wjv ,

Ngoài ra docker {container,image,volume,network} prune, có thể được sử dụng để loại bỏ các trường hợp không sử dụng chỉ một loại đối tượng.

Được giới thiệu trong cam kết 913e5cb , chỉ dành cho Docker 1.13+.

docker container prune

Cảm ơn bạn đã chia sẻ - để điều này trở nên hữu hình, tôi sẽ trích dẫn bạn trong câu trả lời cao trong chủ đề
qkrijger

Như thường lệ, thêm -fcờ để buộc dọn dẹp mà không có câu hỏi nào.
Dirk

3
nên được đánh dấu là câu trả lời đúng vào ngày hôm nay, hầu hết các câu hỏi trên đều quay ngược thời gian, nhưng là những cái gật đầu quá phức tạp
Eugen Mayer

Đồng ý, gần đây dễ dàng hơn nhiều, lên bạn đi!
Maxim Geerinck

Mô tả trong khối mã là dành cho docker system prune -a, loại bỏ các hình ảnh không sử dụng. docker system prunechỉ loại bỏ hình ảnh lơ lửng , hoặc hình ảnh mà không có thẻ.
smilebomb

104

Bây giờ có thể sử dụng lọc với docker ps:

docker rm $(docker ps -q -f status=exited)

Và cho hình ảnh :

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

Tuy nhiên, bất kỳ lỗi nào trong số đó sẽ gây ra docker rmhoặc gây ra docker rmilỗi khi không có thùng chứa phù hợp. Thủ docker rm $(docker ps -aq)thuật cũ thậm chí còn tồi tệ hơn khi nó cố gắng loại bỏ bất kỳ container đang chạy nào, thất bại ở mỗi cái.

Đây là một tập lệnh sạch hơn để thêm vào ~/.bashrchoặc ~/.profile:

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

Chỉnh sửa: Như đã lưu ý dưới đây, câu trả lời ban đầu là để xóa hình ảnh, không phải container. Cập nhật để trả lời cả hai, bao gồm các liên kết mới đến tài liệu. Cảm ơn Adrian (và câu trả lời của Ryan) đã đề cập đến psbộ lọc mới .


2
Lưu ý thực tế của việc này - bạn không vô tình giết chết storageconatiners.
Sobrique

3
Bạn cũng có thể sử dụng status=createdđể có được những cái không chạy và chưa bao giờ chạy.
enderland 17/2/2016

96

CẬP NHẬT 2019 (MỚI NHẤT)

docker container prune

Cách này - 2017 (OLD)

Để loại bỏ TẤT CẢ CÁC CONTAINED STOPPED

docker rm $(docker ps -a -q)

Để xóa TẤT CẢ CÁC CONTAINERS (STOPPED VÀ NON STOPPED)

docker rm  -f $(docker ps -a -q)

3
bị từ chối , vì điều này chắc chắn không phải là cách bạn làm trong năm 2017 - thì sẽ là như vậy docker volume/container/image prune, hãy xem stackoverflow.com/a/39860665/3625317
Eugen Mayer

6
upvote để chống lại downvote vì a) câu trả lời này là từ năm 2016 và b) rất nhiều người không chạy cạnh chảy máu.
quan tâm

49

Loại bỏ tất cả các container bị dừng:

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

Từ nhận xét của pauk960 :

Kể từ phiên bản 1.3.0, bạn có thể sử dụng các bộ lọc docker psthay vì grep Exitedsử dụng docker ps -a -f status=exited. Và nếu bạn sử dụng -qvới nó, bạn chỉ có thể nhận ID container thay vì đầu ra đầy đủ, không cần sử dụng awk cho điều đó.


33

Nếu bạn không muốn xóa tất cả các vùng chứa, bạn có thể chọn tất cả các vùng chứa được tạo trước hoặc sau một vùng chứa cụ thể có docker ps --before <container-ID>hoặc có docker ps --since <container-ID>. Tính năng này ít nhất là trong phiên bản Docker 0.6.5.

Giả sử bạn đã phát triển hệ thống của mình và hiện tại nó đang hoạt động, nhưng vẫn còn một số container. Bạn muốn loại bỏ các container được tạo trước phiên bản làm việc đó. Xác định ID của container làm việc với docker ps.

Loại bỏ các container được tạo trước một container khác

docker rm $(docker ps --before 9c49c11c8d21 -q)

Một vi dụ khac. Bạn có cơ sở dữ liệu của bạn đã chạy trên một Docker container. Bạn đã phát triển ứng dụng của mình để chạy trên một container khác và bây giờ bạn có một số container không cần thiết.

Loại bỏ các container được tạo sau một container nhất định

docker rm $(docker ps --since a6ca4661ec7f -q)

Docker lưu trữ các container /var/lib/docker/containerstrong Ubuntu. Tôi nghĩ rằng các thùng chứa thêm không gây hại gì khác, nhưng chiếm dung lượng đĩa.


32

Cập nhật: Kể từ phiên bản Docker 1.13 (phát hành tháng 1 năm 2017), bạn có thể ban hành lệnh sau để dọn sạch các container bị dừng, khối lượng không sử dụng, hình ảnh lơ lửng và mạng không sử dụng:

docker system prune

Nếu bạn muốn đảm bảo rằng bạn chỉ xóa các thùng chứa có exitedtrạng thái, hãy sử dụng:

docker ps -aq -f status=exited | xargs docker rm

Tương tự, nếu bạn đang dọn dẹp các công cụ docker, bạn có thể loại bỏ các hình ảnh chưa được đặt tên, không được đặt tên theo cách này:

docker images -q --no-trunc -f dangling=true | xargs docker rmi

22

Đây là docker-cleanupkịch bản của tôi , loại bỏ các thùng chứa và hình ảnh không có thẻ. Vui lòng kiểm tra nguồn cho bất kỳ cập nhật.

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

Nguồn: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup


@BradM bồ Cảm ơn! Bạn cũng có thể thích những thứ này: github.com/blueyed/dotfiles/commit/
mẹo

3
Không hoạt động trên OSX vì xargs --no-run-if-emptytùy chọn
caktux 14/07/2015

13

Đầu tiên, dừng chạy container trước khi cố gắng loại bỏ chúng

Loại bỏ các container đang chạy

docker rm $(docker stop -t=1 $(docker ps -q))

Bạn có thể sử dụng killthay vì stop. Trong trường hợp của tôi, tôi thích stopvì tôi có xu hướng chạy lại chúng so với việc tạo một cái mới mỗi lần vì vậy tôi cố gắng tắt chúng một cách độc đáo.

Lưu ý: Cố gắng dừng một container sẽ gây ra lỗi cho bạn:

Lỗi: Không thể xóa vùng chứa đang chạy, vui lòng dừng nó trước

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

docker rm $(docker ps -a -q)

11

Loại bỏ tất cả các container khỏi Windows shell:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Tôi sẽ bao gồm điều này trong câu trả lời của tôi vì đó là trang đầu tiên. Cảm ơn
qkrijger

"Từ Windows shell" ? Bạn có nghĩa là "sử dụng Windows shell (CMD)" ?
Peter Mortensen

10

https://github.com/HardySimpson/docker-cleanup

Docker dọn dẹp

Một vỏ nhỏ tất cả trong một, loại bỏ:

  • Các container không chạy hơn một ngày trước
  • Hình ảnh không thuộc về bất kỳ container nào còn lại

Có ý định chạy như một công việc crontab

Đặc tính

  • Nó sẽ xóa tất cả <none>:<none>hình ảnh
  • Nếu hình ảnh có nhiều tham chiếu thẻ repo: nó sẽ xóa tất cả thẻ repo: ngoại trừ việc chạy một container. Thật ra đó là bản chất của "docker rmi".
  • Nhiều thông báo lỗi sẽ được hiển thị trên màn hình và bạn có thể quyết định 2>/dev/nullhay không
  • Tìm hiểu điều gì đó từ docker-gc và khắc phục sự cố của nó (nó không thể xóa hình ảnh có replipl repo: tag)

9

Vì vậy, cá nhân tôi khuyên bạn nên thực hiện điều này như một phần của tập lệnh triển khai cho cả hình ảnh và vùng chứa, chỉ giữ lại n container và hình ảnh gần đây nhất. Tôi gắn thẻ các hình ảnh Docker của mình với cùng một lược đồ phiên bản mà tôi sử dụng git tagcũng như luôn gắn thẻ hình ảnh Docker mới nhất với "mới nhất". Điều này có nghĩa là không cần dọn dẹp bất cứ thứ gì, hình ảnh Docker của tôi trông giống như:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

Bây giờ, tất nhiên tôi không muốn giữ tất cả hình ảnh (hoặc thùng chứa) của mình trở lại vĩnh viễn trên tất cả các hộp sản xuất của mình. Tôi chỉ muốn 3 hoặc 4 cuối cùng cho rollback và loại bỏ mọi thứ khác. Unix taillà người bạn tốt nhất của bạn ở đây. Vì docker imagesdocker pscả hai thứ tự theo ngày, chúng tôi chỉ có thể sử dụng tailđể chọn tất cả trừ ba hàng đầu và loại bỏ chúng:

docker rmi $(docker images -q | tail -n +4)

Chạy cùng với các tập lệnh triển khai của bạn (hoặc cục bộ) để luôn giữ đủ hình ảnh để thoải mái quay lại mà không chiếm quá nhiều chỗ hoặc làm lộn xộn các công cụ với hình ảnh cũ.

Cá nhân, tôi chỉ giữ một container trên hộp sản xuất của mình bất cứ lúc nào, nhưng bạn có thể làm điều tương tự với các container nếu bạn muốn nhiều hơn:

docker rm $(docker ps -aq | tail -n +4)

Cuối cùng, trong ví dụ đơn giản hóa của chúng tôi, chúng tôi chỉ xử lý một kho lưu trữ tại một thời điểm, nhưng nếu bạn có nhiều hơn, bạn có thể tinh vi hơn một chút với cùng một ý tưởng. Nói rằng tôi chỉ muốn giữ ba hình ảnh cuối cùng từ some numpo / some_image. Tôi chỉ có thể hòa nhập grepawktrên con đường của mình:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

Một lần nữa, ý tưởng tương tự áp dụng cho các container, nhưng bạn hiểu nó vào thời điểm này vì vậy tôi sẽ ngừng đưa ra ví dụ.


8

Sử dụng:

docker rm -f $(docker ps -a -q)

Nó mạnh mẽ dừng lại và loại bỏ tất cả các container có mặt tại địa phương.


Vui lòng chỉnh sửa với nhiều thông tin hơn. Các câu trả lời chỉ dành cho mã và "thử cái này" không được khuyến khích, vì chúng không chứa nội dung có thể tìm kiếm và không giải thích lý do tại sao một người nào đó nên "thử cái này". Chúng tôi nỗ lực ở đây để trở thành một nguồn tài nguyên cho kiến ​​thức.
Brian Tompsett - 汤

Trong Ubuntu 16.04, docker yêu cầu sudo, vì vậy bạn phải viết sudo docker rm -f $(sudo docker ps -a -q).
Elliott

như một điểm cộng, điều này cũng hoạt động trong Windows dưới quyền hạn!
Robert Ivanc

@Elliott Tôi nghĩ sudolà bắt buộc ở mọi nơi trừ khi bạn thêm người dùng của mình vào nhóm 'docker'. Tôi sử dụng Ubuntu 16.10 mà không cần sudo bằng cách thêm người dùng của mình vào nhóm docker.
emory

7

Loại bỏ 5 container cũ nhất:

docker rm `docker ps -aq | tail -n 5`

Xem có bao nhiêu container còn lại:

docker ps -aq | wc -l

Công việc tốt đẹp @Pithikos. Tôi đã thêm câu trả lời loại bỏ tất cả các container cũ.
Mostafa Ghadimi

7

Loại bỏ tất cả các container đã dừng.

sudo docker rm $ (sudo docker ps -a -q)

Điều này sẽ loại bỏ tất cả các container bị dừng bằng cách lấy danh sách tất cả các container có docker ps -a -q và chuyển id của chúng cho docker rm. Điều này sẽ không xóa bất kỳ container đang chạy nào và nó sẽ cho bạn biết nó không thể xóa hình ảnh đang chạy.

Xóa tất cả các hình ảnh chưa được đánh dấu

Bây giờ bạn muốn dọn sạch những hình ảnh cũ để tiết kiệm không gian.

sudo docker rmi $ (hình ảnh sudo docker -q - bộ lọc "dangling = true")


Đừng quên xóa khối lượng docker bằng cách chỉ định tùy chọn -v (sudo docker rm -v $ (sudo docker ps -a -q))
vcarel 9/11/2015

Không nhìn lên điều này, nhưng tôi đoán giống như:docker ps -aq | xargs docker rm -v
quine 23/03/18

Điều này chỉ hoạt động trên Linux, không phải Windows ... Nhưng docker rm -f $(docker ps -a -q)hoạt động trong PowerShell / Docker cho Windows.
Peter Mortensen

6

Cách mới: spotify / docker-gc chơi trò lừa.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Các container đã thoát hơn một giờ trước được gỡ bỏ.
  • Hình ảnh không thuộc về bất kỳ container nào còn lại sau đó bị xóa

Nó đã hỗ trợ cài đặt môi trường

Buộc xóa hình ảnh có nhiều thẻ

 FORCE_IMAGE_REMOVAL=1

Buộc xóa container

 FORCE_CONTAINER_REMOVAL=1 

Không bao gồm các container và hình ảnh đã thoát gần đây khỏi Bộ sưu tập rác

 GRACE_PERIOD_SECONDS=86400

Cài đặt này cũng ngăn chặn việc xóa các hình ảnh đã được tạo ra ít hơn GRACE_PERIOD_SECONDS vài giây trước.

Chạy khô

 DRY_RUN=1

Dọn dẹp khối lượng thùng chứa mồ côi CLEAN_UP_VOLUMES = 1

Tham khảo: docker-gc

Cách làm cũ:

xóa các container cũ, không chạy

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

xóa tất cả các hình ảnh liên quan đến container docker không chạy

 docker images -q | xargs --no-run-if-empty docker rmi

dọn dẹp khối lượng docker mồ côi cho docker phiên bản 1.10.x trở lên

 docker volume ls -qf dangling=true | xargs -r docker volume rm

Dựa trên khoảng thời gian

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm

1
Thú vị thay thế. +1
VonC

6
  1. Hủy bỏ tất cả các quá trình docker:

    docker rm $(docker ps -a -q)
    
  2. Loại bỏ container cụ thể:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    


4
#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done

đối với những người không muốn tự tìm kiếm nó github.com/spotify/docker-gc
nghiệt ngã

Thật hoàn hảo. Tôi cũng đã viết một câu trả lời có chức năng tương tự.
Mostafa Ghadimi

3

Tôi luôn luôn sử dụng docker rmi $(docker ps -a -q)để loại bỏ tất cả các hình ảnh.

Bạn có thể xóa thư mục /var/lib/docker/graphkhi docker rmithất bại.


Cảm ơn bạn đã thêm thông tin / var / lib / docker / graph
Jonathan DeMarks 5/03/2015

Các câu hỏi là làm thế nào để loại bỏ container, không phải hình ảnh.
pauk960

3

Bạn chỉ có thể loại bỏ các container đã dừng. Dừng tất cả lại từ đầu

docker stop $(docker ps -a -q)

Sau đó, bạn có thể loại bỏ

docker rm $(docker ps -a -q)


3

Hãy thử lệnh này để làm sạch các thùng chứa và hình ảnh lơ lửng.

docker system prune -f

Đây là một pro-tip tuyệt vời!
b01

3

Các bước cơ bản để dừng / xóa tất cả các container và hình ảnh

  1. Liệt kê tất cả các container

    docker ps -aq

  2. Dừng tất cả các container đang chạy

    docker stop $(docker ps -aq)

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

    docker rm $(docker ps -aq)

  4. Xóa tất cả hình ảnh

    docker rmi $(docker images -q)

Lưu ý: Trước tiên, bạn phải dừng tất cả các container đang chạy trước khi xóa chúng. Ngoài ra trước khi xóa một hình ảnh, bạn phải dừng và loại bỏ (các) thùng chứa phụ thuộc của nó.


2

Đối với bất kỳ ai quan tâm, tôi lấy ví dụ từ qkrijger và biến nó thành một tất cả rõ ràng (dừng và xóa tất cả)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`

Nếu bạn vẫn loại bỏ các container, thì docker rm -f $(docker ps --no-trunc -aq)nhanh hơn
qkrijger

Đúng, nhưng nếu bạn cần nó để tắt máy đúng cách để dọn sạch các tài nguyên được chia sẻ hoặc sử dụng lại (tức là khối lượng được đính kèm, đóng kết nối hoạt động chính xác, v.v.) thì trước tiên bạn cần phải dừng cuộc gọi. Ví dụ tuyệt vời, nếu bạn có một container Jenkins, thì việc giết container là một ý tưởng tồi. Bạn muốn nó lưu mọi thay đổi chưa được xác nhận, cảnh báo người dùng đã đăng nhập và rất quan trọng là dừng tất cả các bản dựng.
Kraig McConaghy

đồng ý, đó là trường hợp sử dụng rất hợp lệ
qkrijger

2
#!/bin/bash

echo Cleanup unused containers
unused_containers=$(docker ps -a -q --filter="status=exited")
if [[ -n $unused_containers ]]
then
  docker rm $unused_containers
fi

echo Cleanup unused images
unused_images=$(docker images | grep '^<none>' | awk '{print $3}')
if [[ -n $unused_images ]]
then
  docker rmi $unused_images
fi

5
Khi bạn đang trả lời, tốt nhất nên có một số lời giải thích về những gì giải pháp thực hiện thay vì chỉ là một bãi chứa mã, vì nếu không thì câu trả lời có thể bị xóa.
AlBlue


2

Tôi đang sử dụng:

docker rm -v $(docker ps -a -q -f status=exited)

để xóa các container đã thoát và:

docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")

để thoát khỏi tất cả các hình ảnh chưa được đánh dấu.

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.