Cách xóa hình ảnh Docker cũ và không sử dụng


762

Khi chạy Docker trong một thời gian dài, có rất nhiều hình ảnh trong hệ thống. Làm cách nào tôi có thể xóa tất cả các hình ảnh Docker không sử dụng cùng một lúc an toàn để giải phóng bộ nhớ?

Ngoài ra, tôi cũng muốn xóa hình ảnh được kéo từ nhiều tháng trước, trong đó có chính xác TAG.

Vì vậy, tôi không yêu cầu chỉ xóa những hình ảnh không có thẻ. Tôi đang tìm cách để loại bỏ những hình ảnh không sử dụng chung, bao gồm cả những hình ảnh chưa được xử lý và những hình ảnh khác như được kéo cách đây vài tháng với chính xác TAG.

Câu trả lời:


1402

Cập nhật tháng 9 năm 2016: Docker 1.13: PR 26108cam kết 86de7c0 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 của trình nền docker 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 prunesẽ xóa TẤT CẢ dữ liệu lơ lửng (tức là theo thứ tự: container bị dừng, khối lượng không có container và hình ảnh không có container). Ngay cả dữ liệu không sử dụng, với -atùy chọn.

Bạn cũng có:

Đối với hình ảnh không sử dụng , sử dụng docker image prune -a(để loại bỏ hình ảnh lơ lửng và không được chỉnh sửa).
Cảnh báo: ' không sử dụng ' có nghĩa là "hình ảnh không được tham chiếu bởi bất kỳ container nào": hãy cẩn thận trước khi sử dụng -a.

Như được minh họa trong câu trả lời của AL , sẽ loại bỏ tất cả các hình ảnh không sử dụng, không chỉ những hình ảnh lơ lửng ... có thể là một chút quá nhiều.docker system prune --all

Kết hợp docker xxx prunevới --filtertùy chọn có thể là một cách tuyệt vời để hạn chế việc cắt tỉa ( docker SDK API tối thiểu 1.28, vì vậy docker 17.04+ )

Các bộ lọc hiện được hỗ trợ là:

  • until (<timestamp>) - chỉ xóa các thùng chứa, hình ảnh và mạng được tạo trước dấu thời gian đã cho
  • label( label=<key>, label=<key>=<value>, label!=<key>, Hoặc label!=<key>=<value>) - chỉ loại bỏ các thùng chứa, hình ảnh, mạng, và khối lượng với (hoặc không , trong trường hợp label!=...được sử dụng) các nhãn theo quy định.

Xem " Hình ảnh tỉa " cho một ví dụ.


Câu trả lời gốc (tháng 9 năm 2016)

Tôi thường làm:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

Tôi có một bí danh để xóa những [hình ảnh lơ lửng] 13 :drmi

Bộ dangling=truelọc tìm thấy hình ảnh không sử dụng

Bằng cách đó, mọi hình ảnh trung gian không còn được tham chiếu bởi hình ảnh được gắn nhãn sẽ bị xóa.

Tôi làm tương tự đầu tiên cho các quy trình đã thoát (container)

alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'

Như haridsv chỉ ra trong các ý kiến :

Về mặt kỹ thuật, trước tiên bạn nên dọn sạch các thùng chứa trước khi làm sạch hình ảnh, vì điều này sẽ bắt được nhiều hình ảnh lơ lửng hơn và ít lỗi hơn .


Jess Frazelle (jfrazelle)chức năng bashrc :

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}

Để xóa hình ảnh cũ và không chỉ là hình ảnh "không được ước tính", bạn có thể xem xét docker-gc:


Một container Docker đơn giản và tập lệnh thu gom rác hình ảnh.

  • 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 đó sẽ bị xóa.

29
Có tài liệu về những gì "dangling=true"thực sự có nghĩa là gì?
CivilFan

1
Kịch bản này không thể xóa một số hình ảnh được kéo cách đây vài tháng
Quanlong

2
dcleanupnó thật tuyệt!
Quanlong

4
@herm Đầu tiên, docker system pruneloại bỏ nhiều hơn chỉ là hình ảnh. Hãy chắc chắn để sử dụng docker image prunethay thế. Và hãy thật cẩn thận với -a: một tác động docker system prune -acó thể tàn phá (loại bỏ cả khối lượng). Cuối cùng, vâng, -aloại bỏ hình ảnh không sử dụng, tôi sẽ chỉnh sửa câu trả lời.
VonC

2
@stom: 'không sử dụng' có nghĩa là "hình ảnh không được tham chiếu bởi bất kỳ vùng chứa nào, nhưng lủng lẳng có nghĩa là không được gắn thẻ (chỉ là một id).
VonC

125

Cập nhật lần thứ hai (2017-07-08):

Tham khảo (một lần nữa) đến VonC, bằng cách sử dụng gần đây hơn system prune. Người thiếu kiên nhẫn có thể bỏ qua lời nhắc với -f, --forcetùy chọn:

docker system prune -f

Sự thiếu kiên nhẫn và liều lĩnh có thể loại bỏ thêm "những hình ảnh không được sử dụng không chỉ là những hình ảnh lơ lửng" với -a, --alltùy chọn:

docker system prune -af

https://docs.docker.com/engine/reference/commandline/system_prune/

Cập nhật:

Tham khảo câu trả lời của VonC sử dụng các prunelệnh được thêm gần đây . Đây là tiện ích bí danh vỏ tương ứng:

alias docker-clean=' \
  docker container prune -f ; \
  docker image prune -f ; \
  docker network prune -f ; \
  docker volume prune -f '

Câu trả lời cũ:

Xóa các container đã dừng (thoát):

$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

Xóa hình ảnh không sử dụng (lơ lửng):

$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

Nếu bạn đã hết sức thận trọng về việc mất dữ liệu không thể hủy bỏ , thì bạn có thể xóa các khối lượng không sử dụng (lơ lửng) (v1.9 trở lên):

$ docker volume ls -qf "dangling=true" | xargs docker volume rm

Ở đây họ đang ở trong một bí danh vỏ tiện lợi:

alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

Người giới thiệu:


3
Tôi nên thận trọng với việc dọn dẹp âm lượng. Cả hai khối lượng container được tạo tự động và khối lượng được đặt tên hiện không được sử dụng đều được liệt kê cùng với dangling = true.
BMitch

1
@BMitch, bạn hoàn toàn chính xác; Tôi đã thêm một cảnh báo nghiêm khắc vào docker volume rmcông thức. Tôi sẽ hoan nghênh mọi đề xuất mà bạn có.
rubicks

1
Tôi muốn docker cung cấp cho chúng tôi một tùy chọn bộ lọc khác cho các tập được đặt tên. Nếu tôi đưa ra một cách giải quyết tốt, tôi chắc chắn sẽ chia sẻ.
BMitch

2
có, nhưng thật không may, nó không tách khối lượng được đặt tên khỏi một khối lượng ẩn danh bằng một cờ đơn giản. Lệnh tôi đã sử dụng là lệnh docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | xargs --no-run-if-empty docker volume rmnày sẽ hoạt động miễn là bạn không bao giờ đặt tên cho các tập của mình bằng một cái gì đó tương tự như hướng dẫn. Tôi có thể điều chỉnh điều này cho cú pháp bộ lọc mới.
BMitch

1
Loại bỏ khối lượng không sử dụng (lơ lửng) thực sự giúp chúng tôi!
Kane

61

Để xóa hình ảnh được gắn thẻ cũ hơn một tháng tuổi:

$ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' \
    | grep ' months' | awk '{ print $1 }' \
    | xargs --no-run-if-empty docker rmi

Lưu ý rằng sẽ không thể xóa hình ảnh được sử dụng bởi một container, được tham chiếu trong kho lưu trữ, có hình ảnh con phụ thuộc ... đó có thể là những gì bạn muốn. Khác chỉ cần thêm -fcờ.

Ví dụ về /etc/cron.daily/docker-gckịch bản:

#!/bin/sh -e

# Delete all stopped containers (including data-only containers).
docker ps -a -q --no-trunc --filter "status=exited" | xargs --no-run-if-empty docker rm -v

# Delete all tagged images more than a month old
# (will fail to remove images still used).
docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' | grep ' months' | awk '{ print $1 }' | xargs --no-run-if-empty docker rmi || true

# Delete all 'untagged/dangling' (<none>) images
# Those are used for Docker caching mechanism.
docker images -q --no-trunc --filter dangling=true | xargs --no-run-if-empty docker rmi

# Delete all dangling volumes.
docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm

2
+1 Đối với lệnh xóa hình ảnh docker cũ. Hơi khó khăn một chút, nhưng giải pháp là nguyên bản và hoạt động hoàn hảo :)
Rick

3
Điều này là tốt tuy nhiên tôi nghĩ rằng điều này chỉ xóa các hình ảnh docker ít nhất 4 tháng tuổi. .CreatedSincesử dụng tuần làm đơn vị thời gian trong đầu ra ngay cả trên các hình ảnh đã nhiều tuần tuổi, ví dụ 12 weeks.
joelittlejohn

2
Điều này làm việc cho tôi, tốt đẹp và đơn giản:docker images | grep ' months' | awk '{ print $3 }' | xargs --no-run-if-empty docker rmi -f
Kent Bull

34

Các câu trả lời khác là rất tốt, cụ thể:

docker system prune # doesn't clean out old images
docker system prune --all # cleans out too much

Nhưng tôi cần một cái gì đó ở giữa hai lệnh để filtertùy chọn là thứ tôi cần:

docker image prune --all --filter "until=4320h" # delete images older than 6 months ago; 4320h = 24 hour/day * 30 days/month * 6 months

Mong rằng sẽ giúp :)

Để tham khảo: https://docs.docker.com/config/pruning/#prune-images


1
Câu trả lời rất bị đánh giá thấp! Có thể cắt tỉa với một ngày cắt là vô cùng hữu ích.
Nik Reiman

24

Giả sử bạn có Docker 1.13 trở lên, bạn chỉ có thể sử dụng các lệnh cắt tỉa. Đối với câu hỏi của bạn đặc biệt để loại bỏ hình ảnh cũ, bạn muốn cái đầu tiên.

# Remove unused images
docker image prune

# Remove stopped containers.
docker container prune

# Remove unused volumes
docker volume prune

# Remove unused networks
docker network prune

# Command to run all prunes:
docker system prune

Tôi khuyên bạn không nên làm quen với việc sử dụng docker system prunelệnh. Tôi nghĩ người dùng sẽ vô tình xóa những thứ họ không có ý định. Cá nhân, tôi sẽ chủ yếu sử dụng các lệnh docker image prunedocker container prune.


4
bạn không muốn cắt tỉa các mạng không sử dụng phải không? giống như, nếu tất cả các container bị dừng và tôi xóa các mạng đó, các container sẽ hoạt động như thế nào nếu tôi khởi động chúng. Các mạng có được tạo cùng với docker chạy không?
tham gia

@meffect Tôi hoàn toàn đồng ý và tin rằng tôi đã bỏ mạng. Tôi đã bao gồm điều đó và thêm một phần vào cuối nói rằng tôi không khuyên bạn nên sử dụng docker system prunengoại trừ các mận riêng lẻ.
trình viên

15

Cho đến bây giờ (Docker phiên bản 1.12), chúng tôi đang sử dụng lệnh sau để xóa tất cả các container đang chạy. Ngoài ra, nếu chúng ta muốn xóa các ổ đĩa, chúng ta có thể thực hiện điều đó bằng cách sử dụng thẻ -v tương ứng của nó trong lệnh sau.

Xóa tất cả các container đã thoát

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

Xóa tất cả các container đã dừng

docker rm $(docker ps -a -q)

Xóa tất cả các container đang chạy và đã dừng

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

Loại bỏ tất cả các container, không có bất kỳ tiêu chí

docker container rm $(docker container ps -aq)

Nhưng, trong phiên bản 1.13 trở lên, để hoàn thành hệ thống và dọn dẹp, chúng ta có thể trực tiếp sử dụng lệnh sau:

docker system prune

Tất cả các container, hình ảnh, mạng và khối lượng không sử dụng sẽ bị xóa. Chúng ta cũng có thể làm điều này bằng cách sử dụng các lệnh sau để dọn sạch các thành phần riêng lẻ:

docker container prune
docker image prune
docker network prune
docker volume prune

14

Điều này làm việc cho tôi:

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

13

Lệnh sau sẽ xóa hình ảnh cũ hơn 48 giờ.

$ docker image prune --all --filter until=48h

1
Sử dụng các bộ lọc cũng có thể liệt kê mọi phiên bản trước một phiên bản được chỉ định: docker image ls --all --filter reference=monolito --filter before=monolito:0.1.8và sau đó áp dụng lệnh rmi để xóa. docker rmi $(docker image ls -q --all --filter reference=monolito --filter before=monolito:0.1.8)
Rodvlopes

9

Gần đây tôi đã viết một kịch bản để giải quyết vấn đề này trên một trong các máy chủ của mình:

#!/bin/bash

# Remove all the dangling images
DANGLING_IMAGES=$(docker images -qf "dangling=true")
if [[ -n $DANGLING_IMAGES ]]; then
    docker rmi "$DANGLING_IMAGES"
fi

# Get all the images currently in use
USED_IMAGES=($( \
    docker ps -a --format '{{.Image}}' | \
    sort -u | \
    uniq | \
    awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \
))

# Get all the images currently available
ALL_IMAGES=($( \
    docker images --format '{{.Repository}}:{{.Tag}}' | \
    sort -u \
))

# Remove the unused images
for i in "${ALL_IMAGES[@]}"; do
    UNUSED=true
    for j in "${USED_IMAGES[@]}"; do
        if [[ "$i" == "$j" ]]; then
            UNUSED=false
        fi
    done
    if [[ "$UNUSED" == true ]]; then
        docker rmi "$i"
    fi
done

8

Dưới đây là một kịch bản để dọn sạch hình ảnh Docker và lấy lại không gian.

#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm

## If you do not want to remove all container you can have filter for days and weeks old like below
#docker ps -a | grep Exited | grep "days ago" | awk '{print $1}' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print $1}' | xargs docker rm

## Removing Dangling images
## There are the layers images which are being created during building a Docker image. This is a great way to recover the spaces used by old and unused layers.

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

## Removing images of perticular pattern For example
## Here I am removing images which has a SNAPSHOT with it.

docker rmi $(docker images | grep SNAPSHOT | awk '{print $3}')

## Removing weeks old images

docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi

## Similarly you can remove days, months old images too.

Kịch bản gốc

https://github.com/vishalvsh1/docker-image-cleanup

Thông thường Docker giữ tất cả các tệp tạm thời liên quan đến xây dựng hình ảnh và các lớp tại

/ var / lib / docker

Đường dẫn này là cục bộ của hệ thống, thường là ở phân vùng gốc, "/" .

Bạn có thể gắn một không gian đĩa lớn hơn và di chuyển nội dung /var/lib/dockerđến vị trí gắn kết mới và tạo một liên kết tượng trưng.

Bằng cách này, ngay cả khi hình ảnh Docker chiếm không gian, nó sẽ không ảnh hưởng đến hệ thống của bạn vì nó sẽ sử dụng một số vị trí gắn kết khác.

Bài gốc: Quản lý hình ảnh Docker trên đĩa cục bộ


6

Tôi đang sử dụng lệnh này:

export BEFORE_DATETIME=$(date --date='10 weeks ago' +"%Y-%m-%dT%H:%M:%S.%NZ")
docker images -q | while read IMAGE_ID; do
    export IMAGE_CTIME=$(docker inspect --format='{{.Created}}' --type=image ${IMAGE_ID})
    if [[ "${BEFORE_DATETIME}" > "${IMAGE_CTIME}" ]]; then
        echo "Removing ${IMAGE_ID}, ${BEFORE_DATETIME} is earlier then ${IMAGE_CTIME}"
        docker rmi -f ${IMAGE_ID};
    fi;
done

Điều này sẽ xóa tất cả các hình ảnh có thời gian tạo lớn hơn 10 tuần trước.


Tôi nghĩ rằng bạn đã trao đổi IMAGE_CTIMEBEFORE_DATETIMEtrong echolệnh đó
Udo G

5

Nếu bạn muốn xóa hình ảnh đã kéo X tháng trước, bạn có thể thử ví dụ bên dưới loại bỏ hình ảnh được tạo ba tháng trước:

three_months_old_images=`docker images | grep -vi "<none>" | tr -s ' ' | cut -d" " -f3,4,5,6 | grep "3 months ago" | cut -d" " -f1`
docker rmi $three_months_old_images

1
Điều này LAF không đúng. Điều này loại bỏ hình ảnh được tạo ra 3 tháng trước, không phải hình ảnh được kéo 3 tháng trước (nếu bạn kéo chúng từ một nguồn từ xa, chúng có thể đã được 3 tháng tuổi ngay lập tức).
Andrew Ferrier

Điều này giúp tôi tạo ra nhiều bộ lọc hơn, dựa trên các tiêu chí khác nhau
david.sansay

4

Để cắt tỉa tất cả các hình ảnh và khối lượng là tốt
docker system prune -af --volumes


3

docker system prune -a

(Bạn sẽ được yêu cầu xác nhận lệnh. Sử dụng -fđể buộc chạy, nếu bạn biết bạn đang làm gì.)


5
Điều này là nguy hiểm , xem các ý kiến ​​khác về docker system pruneviệc loại bỏ ngay cả khối lượng được đặt tên với -a.
RichVel

3

@VonC đã đưa ra một câu trả lời rất hay, nhưng để hoàn thiện thì đây là một đoạn script nhỏ mà tôi đã sử dụng --- và cũng có bất kỳ quy trình Docker lặt vặt nào bạn nên có:

#!/bin/bash

imgs=$(docker images | awk '/<none>/ { print $3 }')
if [ "${imgs}" != "" ]; then
   echo docker rmi ${imgs}
   docker rmi ${imgs}
else
   echo "No images to remove"
fi

procs=$(docker ps -a -q --no-trunc)
if [ "${procs}" != "" ]; then
   echo docker rm ${procs}
   docker rm ${procs}
else
   echo "No processes to purge"
fi

Hoạt động tuyệt vời nhưng vẫn có thể nhận được Error response from daemon: You cannot remove a running container. Đã thêm docker kill $(docker ps -q)trước dòng 3 vào địa chỉ
Vincent

Tại sao không sử dụng $(docker images -q)thay thế $(docker images | awk '/<none>/ { print $3 }')?
SeF

1
@SeF: Nếu tôi làm docker images -qtôi có một vectơ id hình ảnh, không có gì khác. Nếu tôi làm những gì tôi làm tôi sẽ nhận được nhiều hơn - cho phép tôi lọc <none>khi tôi làm ở đây. Có ý nghĩa?
Dirk Eddelbuettel

2

Để xóa các hình ảnh được gắn thẻ không chứa container đang chạy, bạn sẽ phải sử dụng một đoạn script nhỏ:

#!/bin/bash

# remove not running containers
docker rm $(docker ps -f "status=exited" -q)

declare -A used_images

# collect images which has running container
for image in $(docker ps | awk 'NR>1 {print $2;}'); do
    id=$(docker inspect --format="{{.Id}}" $image);
    used_images[$id]=$image;
done

# loop over images, delete those without a container
for id in $(docker images --no-trunc -q); do
    if [ -z ${used_images[$id]} ]; then
        echo "images is NOT in use: $id"
        docker rmi $id
    else
        echo "images is in use:     ${used_images[$id]}"
    fi
done

2

Loại bỏ các container cũ vài tuần trước.

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

Xóa hình ảnh cũ vài tuần trước. Hãy cẩn thận. Điều này sẽ xóa hình ảnh cơ bản đã được tạo ra vài tuần trước nhưng hình ảnh mới của bạn có thể đang sử dụng.

docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')


2

Cách xóa hình ảnh được gắn thẻ

  1. docker rmi thẻ đầu tiên

  2. Docker rmi hình ảnh.

    # có thể được thực hiện trong một cuộc gọi rmi docker, ví dụ: # docker rmi <repo: tag> <imageid>

(điều này hoạt động vào tháng 11 năm 2016, Docker phiên bản 1.12.2)

ví dụ

$ docker images 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
usrxx/the-application   16112805            011fd5bf45a2        12 hours ago        5.753 GB
usryy/the-application   vx.xx.xx            5af809583b9c        3 days ago          5.743 GB
usrzz/the-application   vx.xx.xx            eef00ce9b81f        10 days ago         5.747 GB
usrAA/the-application   vx.xx.xx            422ba91c71bb        3 weeks ago         5.722 GB
usrBB/the-application   v1.00.18            a877aec95006        3 months ago        5.589 GB

$ docker rmi usrxx/the-application:16112805 && docker rmi 011fd5bf45a2
$ docker rmi usryy/the-application:vx.xx.xx && docker rmi 5af809583b9c
$ docker rmi usrzz/the-application:vx.xx.xx eef00ce9b81f
$ docker rmi usrAA/the-application:vx.xx.xx 422ba91c71bb
$ docker rmi usrBB/the-application:v1.00.18 a877aec95006

ví dụ: Scripted loại bỏ bất cứ thứ gì cũ hơn 2 tuần.

IMAGESINFO=$(docker images --no-trunc --format '{{.ID}} {{.Repository}} {{.Tag}} {{.CreatedSince}}' |grep -E " (weeks|months|years)")
TAGS=$(echo "$IMAGESINFO" | awk '{ print $2 ":" $3 }' )
IDS=$(echo "$IMAGESINFO" | awk '{ print $1 }' )
echo remove old images TAGS=$TAGS IDS=$IDS
for t in $TAGS; do docker rmi $t; done
for i in $IDS; do docker rmi $i; done

2
docker rm $(docker ps -faq)
docker rmi $(docker ps -faq)

lực lượng -f

-tất cả

-q trong chế độ


1
docker rm `docker ps -aq`

hoặc là

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

3
Tôi nghĩ rằng câu trả lời này là nguy hiểm vì những lệnh đó loại bỏ container. Đầu tiên, OP đã hỏi làm thế nào để loại bỏ hình ảnh, không phải container. Và quan trọng hơn, những lệnh đó có thể gây mất dữ liệu do mọi người có thể có một số dữ liệu có giá trị trong các thùng chứa đã thoát.
u.unver34

Bạn nên mô tả các kết quả không mong muốn có thể áp dụng các lệnh này trên máy chủ sản xuất.
Daniel

Điều này loại bỏ các container, không phải hình ảnh.
SeF

1

Thỉnh thoảng tôi gặp phải các vấn đề trong đó Docker sẽ phân bổ và tiếp tục sử dụng dung lượng đĩa, ngay cả khi không gian được phân bổ cho bất kỳ hình ảnh cụ thể hoặc vùng chứa hiện có. Cách mới nhất tôi vô tình tạo ra vấn đề này là sử dụng công cụ xây dựng "docker-engine" thay vì "docker" trong RHEL 7.1. Điều dường như xảy ra là đôi khi việc dọn dẹp container không được hoàn thành thành công và sau đó không gian không bao giờ được sử dụng lại. Khi ổ đĩa 80 GB tôi phân bổ là / chứa đầy các tệp / var / lib / docker, tôi đã phải đưa ra một cách sáng tạo để giải quyết vấn đề.

Đây là những gì tôi đã đưa ra. Đầu tiên để giải quyết lỗi đầy đĩa:

  1. Dừng docker: systemctl dừng docker
  2. Phân bổ một ổ đĩa mới được gắn kết như say / mnt / docker.
  3. Di chuyển tất cả các tệp trong / var / lib / docker sang / mnt / docker. Tôi đã sử dụng lệnh: rsync -aPHSx --remove-source-files / var / lib / docker / / mnt / docker /
  4. Gắn ổ đĩa mới vào / var / lib / docker.

Tại thời điểm này tôi không còn bị lỗi đĩa đầy đủ nữa, nhưng tôi vẫn đang lãng phí một lượng lớn dung lượng. Các bước tiếp theo là chăm sóc điều đó.

  1. Khởi động Docker: systemctl bắt đầu docker

  2. Lưu tất cả các hình ảnh: docker save $ (hình ảnh docker | sed -e '/ ^ / d' -e '/ ^ REPOSITORY / d' -e 's, [] [] ,:,' -e 's, [ ]. ,, ')> /root/docker.img

  3. Gỡ cài đặt docker.

  4. Xóa mọi thứ trong / var / lib / docker: rm -rf / var / lib / docker / [cdintv] *

  5. Cài đặt lại docker

  6. Kích hoạt docker: systemctl kích hoạt docker

  7. Khởi động docker: systemctl bắt đầu docker

  8. Khôi phục hình ảnh: tải docker </root/docker.img

  9. Bắt đầu bất kỳ container liên tục bạn cần chạy.

Điều này đã giảm mức sử dụng đĩa của tôi từ 67 GB cho docker xuống còn 6 GB cho docker.

Tôi không khuyên bạn nên sử dụng hàng ngày. Nhưng nó rất hữu ích để chạy khi có vẻ như docker đã mất dấu không gian đĩa đã sử dụng do lỗi phần mềm hoặc khởi động lại không mong muốn.


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 meltwater/docker-cleanup.

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ó chạy cứ sau 30 phút theo mặc định. Tuy nhiên, bạn có thể đặt thời gian trễ bằng cách sử dụng cờ này trong vài giây (tùy chọn DELAY_TIME = 1800).

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


1

Nếu bạn tự xây dựng những hình ảnh được cắt tỉa này (từ một số hình ảnh cơ bản cũ hơn khác), hãy cẩn thận với các giải pháp được chấp nhận ở trên docker image prune, vì lệnh này bị cùn và sẽ cố gắng loại bỏ tất cả các phụ thuộc theo yêu cầu của hình ảnh mới nhất của bạn (lệnh nên được có lẽ đổi tên thành docker image*s* prune).

Giải pháp tôi đưa ra cho các đường ống xây dựng hình ảnh docker của tôi (nơi có các bản dựng hàng ngày và tags = ngày ở YYYYMMDDđịnh dạng) là:

# carefully narrow down the image to be deleted (to avoid removing useful static stuff like base images)
my_deleted_image=mirekphd/ml-cpu-py37-vsc-cust

# define the monitored image (tested for obsolescence), which will be usually the same as deleted one, unless deleting some very infrequently built image which requires a separate "clock"
monitored_image=mirekphd/ml-cache

# calculate the oldest acceptable tag (date)
date_week_ago=$(date -d "last week" '+%Y%m%d')

# get the IDs of obsolete tags of our deleted image
# note we use monitored_image to test for obsolescence
my_deleted_image_obsolete_tag_ids=$(docker images --filter="before=$monitored_image:$date_week_ago" | grep $my_deleted_image | awk '{print $3}')

# remove the obsolete tags of the deleted image
# (note it typically has to be forced using -f switch)
docker rmi -f $my_deleted_image_obsolete_tag_ids

0

Có sparrow plugin docker-remove-dangling-hình ảnh bạn có thể sử dụng để dọn sạch các container bị dừng và hình ảnh (dangling) không sử dụng:

$ sparrow plg run docker-remove-dangling-images

Nó hoạt động cả cho Linux và HĐH Windows.


0

Đầu tiên, chạy docker imagesđể xem danh sách hình ảnh và sao chép IMAGE HASH ID vào clipboard.

Chạy docker rmi -f <Image>

Nhớ tùy chọn -flà lực lượng xóa.

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.