วิธีลบอิมเมจ Docker แบบเก่าและที่ไม่ได้ใช้


762

เมื่อรัน Docker เป็นเวลานานระบบจะมีรูปภาพจำนวนมาก ฉันจะลบรูปภาพ Docker ที่ไม่ได้ใช้ทั้งหมดในคราวเดียวเพื่อความปลอดภัยเพื่อเพิ่มพื้นที่จัดเก็บได้อย่างไร

TAGนอกจากนี้ผมยังต้องการที่จะลบภาพดึงเดือนที่ผ่านมาซึ่งมีความถูกต้อง

ดังนั้นฉันไม่ได้ขอให้ลบภาพที่ไม่ได้ติดแท็กเท่านั้น ฉันมองหาวิธีที่จะลบภาพที่ไม่ได้ใช้ทั่วไปซึ่งรวมทั้งการติดแท็กและอื่น ๆ TAGที่ภาพดังกล่าวเป็นเดือนที่ผ่านมากับดึงที่ถูกต้อง

คำตอบ:


1402

อัปเดตเดือนกันยายน 2559: นักเทียบท่า 1.13: PR 26108และยอมรับ 86de7c0แนะนำคำสั่งใหม่ไม่กี่คำเพื่อช่วยให้เห็นภาพว่าพื้นที่ข้อมูล daemon นั้นมีเนื้อที่เท่าไรในดิสก์และช่วยให้ทำความสะอาดส่วนเกิน

docker system pruneจะลบข้อมูลที่ห้อยอยู่ทั้งหมด (เช่นตามลำดับ: คอนเทนเนอร์หยุดทำงานวอลุ่มที่ไม่มีคอนเทนเนอร์และรูปภาพที่ไม่มีคอนเทนเนอร์) แม้แต่ข้อมูลที่ไม่ได้ใช้พร้อม-aตัวเลือก

คุณมี:

สำหรับภาพที่ไม่ได้ใช้ให้ใช้docker image prune -a(สำหรับการลบภาพห้อยและภาพที่ไม่มีการตัดออก)
คำเตือน: ' ที่ไม่ได้ใช้ ' หมายถึง "ภาพไม่ได้อ้างถึงโดยภาชนะใด ๆ": -aต้องระวังก่อนที่จะใช้

ดังแสดงในอลาบาม่า 's คำตอบ , docker system prune --allจะลบทั้งหมดที่ไม่ได้ใช้ภาพที่ไม่ได้เป็นเพียงห้อยคน ... ซึ่งสามารถเป็นบิตมากเกินไป

การรวมdocker xxx pruneกับ--filterตัวเลือกอาจเป็นวิธีที่ดีในการ จำกัด การตัด ( นักเทียบท่า SDK API ขั้นต่ำ 1.28 ดังนั้นนักเทียบท่า 17.04+ )

ตัวกรองที่รองรับในปัจจุบันคือ:

  • until (<timestamp>) - ลบเฉพาะตู้คอนเทนเนอร์รูปภาพและเครือข่ายที่สร้างก่อนเวลาที่กำหนด
  • label( label=<key>, label=<key>=<value>, label!=<key>หรือlabel!=<key>=<value>) - ลบภาชนะบรรจุภาพเครือข่ายและไดรฟ์ที่มี (หรือโดยไม่ได้ในกรณีที่label!=...มีการใช้งาน) ฉลากระบุ

ดู " ภาพตัด " สำหรับตัวอย่าง


คำตอบเดิม (กันยายน 2016)

ฉันมักจะทำ:

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

ฉันมีนามแฝงสำหรับการลบ [รูปภาพห้อย] 13 :drmi

dangling=trueกรองพบว่าภาพที่ไม่ได้ใช้

ด้วยวิธีนี้ภาพกลางใด ๆ ที่ไม่ได้อ้างถึงโดยภาพที่มีป้ายกำกับจะถูกลบออก

ฉันทำเช่นเดียวกันก่อนสำหรับกระบวนการที่ออก (คอนเทนเนอร์)

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

ในฐานะที่เป็นharidsvชี้ให้เห็นในความคิดเห็น :

เทคนิคแรกคุณควรทำความสะอาดภาชนะบรรจุก่อนการทำความสะอาดภาพเช่นนี้จะจับภาพห้อยมากขึ้นและมีข้อผิดพลาดน้อย


Jess Frazelle (jfrazelle)มีฟังก์ชั่น 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
}

หากต้องการลบภาพเก่าไม่ใช่เฉพาะภาพที่ "ไม่ปลอดภัย" คุณสามารถพิจารณาdocker-gc:


คอนเทนเนอร์ Docker แบบง่ายและสคริปต์การรวบรวมขยะของรูปภาพ

  • ภาชนะบรรจุที่ออกจากเกินกว่าหนึ่งชั่วโมงที่ผ่านมาจะถูกลบออก
  • รูปภาพที่ไม่ได้เป็นของคอนเทนเนอร์ที่เหลืออยู่หลังจากนั้นจะถูกลบออก

28
มีเอกสารเกี่ยวกับความ"dangling=true"หมายจริง ๆ หรือไม่?
CivFan

1
สคริปต์นี้ไม่สามารถลบภาพที่ดึงมาหลายเดือนแล้ว
Quanlong

2
dcleanupมันยอดเยี่ยม!
Quanlong

4
@herm ก่อนอื่นให้docker system pruneลบมากกว่าแค่ภาพ ตรวจสอบให้แน่ใจว่าจะใช้docker image pruneแทน และระวังด้วย-a: a docker system prune -aสามารถมีผลกระทบร้ายแรง (ลบไดรฟ์ด้วย) ในที่สุดใช่-aลบภาพที่ไม่ได้ใช้ฉันจะแก้ไขคำตอบ
VonC

2
@stom: 'unused' หมายถึง "รูปภาพที่ไม่ได้อ้างถึงโดยคอนเทนเนอร์ใด ๆ แต่ dangling หมายถึงไม่ได้ติดแท็กเลย (แค่ id)
VonC

125

อัปเดตวินาที (2017-07-08):

อ้างถึง (อีกครั้ง) เพื่อ VonC system pruneนี้ใช้แม้กระทั่งเมื่อเร็ว ใจร้อนสามารถข้ามพรอมต์ด้วย-f, --forceตัวเลือก:

docker system prune -f

ความอดทนและความประมาทสามารถลบ "ภาพที่ไม่ได้ใช้ไม่เพียง แต่ภาพที่ห้อยอยู่" เพิ่มเติมด้วย-a, --allตัวเลือก:

docker system prune -af

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

ปรับปรุง:

อ้างถึงคำตอบของ VonCซึ่งใช้pruneคำสั่งที่เพิ่งเพิ่มเข้าไป นี่คือความสะดวกของนามแฝงเชลล์ที่สอดคล้องกัน:

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

คำตอบเก่า:

ลบคอนเทนเนอร์ที่ถูกหยุด (ออก):

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

ลบภาพที่ไม่ได้ใช้ (ห้อย):

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

หากคุณได้ใช้ความระมัดระวังอย่างยิ่งเกี่ยวกับการสูญเสียข้อมูลที่เอาคืนไม่ได้คุณสามารถลบโวลุ่มที่ไม่ได้ใช้ (ห้อย) (v1.9 ขึ้นไป):

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

ที่นี่พวกเขาอยู่ในนามแฝงเปลือกสะดวก:

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'

อ้างอิง:


3
ฉันจะใช้ความระมัดระวังด้วยการล้างข้อมูลเสียง ทั้งปริมาณที่สร้างโดยอัตโนมัติและปริมาณที่ตั้งชื่อที่ไม่ได้ใช้งานอยู่ในปัจจุบันจะแสดงพร้อมกับ dangling = true
BMitch

1
@BMitch คุณถูกต้องอย่างแน่นอน ฉันได้เพิ่มคำเตือนที่เข้มงวดในdocker volume rmสูตร ฉันยินดีรับข้อเสนอแนะที่คุณมี
rubicks

1
ฉันชอบนักเทียบท่าเพื่อให้ตัวเลือกตัวกรองที่แตกต่างกับเรา ถ้าฉันคิดวิธีแก้ปัญหาที่ดีฉันจะแบ่งปันให้
BMitch

2
ใช่ แต่น่าเสียดายที่มันไม่ได้แยกวอลลุ่มที่มีชื่อออกจากวอลลุ่มที่ไม่ระบุชื่อด้วยการตั้งค่าสถานะแบบง่าย คำสั่งที่ฉันใช้อยู่docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | xargs --no-run-if-empty docker volume rmซึ่งจะทำงานได้ตราบใดที่คุณไม่เคยตั้งชื่อโวลุ่มของคุณด้วยสิ่งที่คล้ายกับ guid ฉันอาจบิดนี้สำหรับไวยากรณ์ตัวกรองใหม่
BMitch

1
การลบโวลุ่มที่ไม่ได้ใช้ (ห้อย) ช่วยเราได้จริงๆ!
เทอรีเคน

61

หากต้องการลบภาพที่ติดแท็กเก่าที่มีอายุมากกว่าหนึ่งเดือนให้ทำดังนี้

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

โปรดทราบว่ามันจะล้มเหลวในการลบภาพที่ใช้โดยคอนเทนเนอร์ที่อ้างอิงในที่เก็บมีภาพเด็กขึ้นอยู่กับ ... ซึ่งอาจเป็นสิ่งที่คุณต้องการ อื่นเพียงแค่เพิ่มการ-fตั้งค่าสถานะ

ตัวอย่างของ/etc/cron.daily/docker-gcสคริปต์:

#!/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 สำหรับคำสั่งที่จะลบภาพนักเทียบท่าเก่า มันเป็น hacky บิต แต่การแก้ปัญหาคือเดิมและทำงานได้อย่างสมบูรณ์ :)
ริก

3
นี้เป็นสิ่งที่ดี แต่ผมคิดว่านี่จะลบเฉพาะภาพนักเทียบท่าที่มีอย่างน้อย4 เดือนเก่า ใช้สัปดาห์เป็นหน่วยของเวลาในการส่งออกแม้ในภาพที่มีจำนวนมากของสัปดาห์เช่น.CreatedSince 12 weeks
joelittlejohn

2
สิ่งนี้ใช้ได้กับฉันดีและเรียบง่าย:docker images | grep ' months' | awk '{ print $3 }' | xargs --no-run-if-empty docker rmi -f
Kent Bull

34

คำตอบอื่น ๆ นั้นยอดเยี่ยมโดยเฉพาะ:

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

แต่ฉันต้องการบางสิ่งที่อยู่ตรงกลางของทั้งสองคำสั่งดังนั้นfilterตัวเลือกคือสิ่งที่ฉันต้องการ:

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

หวังว่าจะช่วย :)

สำหรับการอ้างอิง: https://docs.docker.com/config/pruning/#prune-images


1
คำตอบที่ underrated มาก! ความสามารถในการตัดด้วยวันที่ตัดออกนั้นมีประโยชน์มาก
Nik Reiman

24

สมมติว่าคุณมีDocker 1.13ขึ้นไปคุณสามารถใช้คำสั่งพรุนได้ สำหรับคำถามของคุณในการลบภาพเก่าโดยเฉพาะคุณต้องการภาพแรก

# 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

ฉันจะแนะนำไม่ให้คุ้นเคยกับการใช้docker system pruneคำสั่ง ฉันคิดว่าผู้ใช้จะลบสิ่งที่ไม่ได้ตั้งใจ โดยส่วนตัวฉันจะใช้คำสั่งdocker image pruneและเป็นdocker container pruneหลัก


4
คุณไม่ต้องการตัดเครือข่ายที่ไม่ได้ใช้ใช่ไหม เช่นถ้าคอนเทนเนอร์ทั้งหมดหยุดทำงานและฉันลบเครือข่ายเหล่านั้นคอนเทนเนอร์เหล่านั้นจะทำงานอย่างไรถ้าฉันเริ่มต้น เครือข่ายถูกสร้างขึ้นพร้อมกับการทำงานของนักเทียบท่าหรือไม่?
meffect

@meffect ฉันเห็นด้วยอย่างถ่องแท้และเป็นจุดที่ฉันตัดเครือข่ายออก ฉันได้รวมและเพิ่มส่วนท้ายระบุว่าฉันไม่แนะนำให้ใช้docker system pruneแต่ลูกพรุนส่วนตัว
โปรแกรมเมอร์

15

จนถึงตอนนี้ (Docker เวอร์ชั่น 1.12) เรากำลังใช้คำสั่งต่อไปนี้เพื่อลบคอนเทนเนอร์ที่รันอยู่ทั้งหมด นอกจากนี้หากเราต้องการที่จะลบไดรฟ์เราสามารถทำได้ด้วยตนเองโดยใช้แท็กนั้น -v ในคำสั่งดังต่อไปนี้

ลบคอนเทนเนอร์ที่ออกทั้งหมด

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

ลบคอนเทนเนอร์ที่หยุดทั้งหมด

docker rm $(docker ps -a -q)

ลบคอนเทนเนอร์ที่หยุดทำงานและหยุดทำงานทั้งหมด

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

ลบคอนเทนเนอร์ทั้งหมดโดยไม่มีเงื่อนไขใด ๆ

docker container rm $(docker container ps -aq)

แต่ในเวอร์ชัน 1.13 ขึ้นไปสำหรับระบบและการล้างข้อมูลที่สมบูรณ์เราสามารถใช้คำสั่งต่อไปนี้โดยตรง:

docker system prune

คอนเทนเนอร์รูปภาพเครือข่ายและโวลุ่มที่ไม่ได้ใช้ทั้งหมดจะถูกลบ นอกจากนี้เรายังสามารถทำได้โดยใช้คำสั่งต่อไปนี้ที่ทำความสะอาดแต่ละองค์ประกอบ

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


13

คำสั่งต่อไปนี้จะลบภาพที่เก่ากว่า 48 ชั่วโมง

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

1
การใช้ตัวกรองยังสามารถแสดงรายการทุกรุ่นก่อนรุ่นที่ระบุ: docker image ls --all --filter reference=monolito --filter before=monolito:0.1.8จากนั้นใช้คำสั่ง rmi เพื่อลบ docker rmi $(docker image ls -q --all --filter reference=monolito --filter before=monolito:0.1.8)
rodvlopes

9

ฉันเพิ่งเขียนสคริปต์เพื่อแก้ปัญหานี้ในหนึ่งในเซิร์ฟเวอร์ของฉัน:

#!/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

นี่คือสคริปต์ในการทำความสะอาดภาพ Docker และเรียกคืนพื้นที่

#!/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.

สคริปต์ต้นฉบับ

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

โดยปกติแล้ว Docker จะเก็บไฟล์ชั่วคราวทั้งหมดที่เกี่ยวข้องกับการสร้างภาพและเลเยอร์ที่

/ var / lib / นักเทียบท่า

เส้นทางนี้อยู่ภายในระบบปกติจะอยู่ที่พาร์ทิชันราก"/"

คุณสามารถเมาท์พื้นที่ดิสก์ที่ใหญ่กว่าและย้ายเนื้อหา/var/lib/dockerไปยังตำแหน่งเมานต์ใหม่และสร้างลิงก์สัญลักษณ์

วิธีนี้แม้ว่าอิมเมจ Docker จะใช้พื้นที่ แต่มันจะไม่ส่งผลกระทบต่อระบบของคุณเนื่องจากจะใช้ตำแหน่งเมานท์อื่น

โพสต์ต้นฉบับ: จัดการอิมเมจ Docker บนโลคัลดิสก์


6

ฉันกำลังใช้คำสั่งนี้:

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

การดำเนินการนี้จะลบรูปภาพทั้งหมดที่มีเวลาสร้างมากกว่า 10 สัปดาห์ก่อน


ฉันคิดว่าคุณสลับIMAGE_CTIMEกับคำสั่งBEFORE_DATETIMEนั้นแล้วecho
Udo G

5

หากคุณต้องการลบภาพที่ดึงมาเมื่อXเดือนที่แล้วคุณสามารถลองตัวอย่างด้านล่างซึ่งลบภาพที่สร้างเมื่อสามเดือนที่ผ่านมา:

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
สิ่งนี้ไม่ถูกต้อง การทำเช่นนี้จะเป็นการลบรูปภาพที่สร้างขึ้นเมื่อ 3 เดือนก่อนไม่ใช่ภาพที่ถูกดึงเมื่อ 3 เดือนที่ผ่านมา (หากคุณดึงภาพจากแหล่งข้อมูลระยะไกลภาพเหล่านั้นจะมีอายุ 3 เดือนได้ทันที)
Andrew Ferrier

สิ่งนี้ช่วยให้ฉันสร้างตัวกรองเพิ่มเติมตามเกณฑ์ที่แตกต่างกัน
david.sansay


3

docker system prune -a

(คุณจะถูกขอให้ยืนยันคำสั่งใช้-fบังคับให้ทำงานหากคุณรู้ว่าคุณกำลังทำอะไรอยู่)


5
นี้เป็นอันตรายดูความคิดเห็นอื่น ๆ เกี่ยวกับการลบเล่มชื่อแม้จะมีdocker system prune -a
RichVel

3

@VonC ได้ให้คำตอบที่ดีมาก แต่สำหรับความสมบูรณ์ที่นี่เป็นสคริปต์เล็ก ๆ น้อย ๆ ที่ฉันได้ใช้ --- และซึ่งยัง nukes กระบวนการใด ๆ ที่ทำผิดพลาดนักเทียบท่าหากคุณมี:

#!/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

ใช้งานได้ดี Error response from daemon: You cannot remove a running containerแต่ยังสามารถได้รับ เพิ่มdocker kill $(docker ps -q)ก่อนที่บรรทัด 3 ไปยังที่อยู่
Vincent

ทำไมไม่ใช้$(docker images -q)แทน$(docker images | awk '/<none>/ { print $3 }')?
SeF

1
@SeF: ถ้าฉันจะdocker images -qได้รับรหัสภาพเวกเตอร์ไม่มีอะไรอื่น ถ้าฉันทำสิ่งที่ฉันทำฉันจะได้รับมากขึ้น - อนุญาตให้ฉันกรอง<none>ตามที่ฉันทำที่นี่ มีเหตุผล?
Dirk Eddelbuettel

2

หากต้องการลบภาพที่ติดแท็กซึ่งไม่ได้ใช้งานคอนเทนเนอร์คุณจะต้องใช้สคริปต์เล็กน้อย:

#!/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

นำภาชนะเก่าออกเมื่อหลายสัปดาห์ก่อน

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

ลบภาพเก่า ๆ เมื่อหลายสัปดาห์ก่อน ระวัง. การทำเช่นนี้จะลบภาพฐานที่สร้างขึ้นเมื่อหลายสัปดาห์ก่อน แต่ภาพใหม่ของคุณอาจกำลังใช้อยู่

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


2

วิธีลบภาพที่ติดแท็ก

  1. นักเทียบท่า rmi แท็กก่อน

  2. นักเทียบท่า rmi ภาพ

    # ที่สามารถทำได้ในการโทรหนึ่งนักเทียบท่า rmi เช่น: # นักเทียบท่า rmi <repo: tag> <imageid>

(ใช้ได้กับ พ.ย. 2559 รุ่น Docker 1.12.2)

เช่น

$ 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

เช่น Scripted ลบสิ่งที่เก่ากว่า 2 สัปดาห์

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


1
docker rm `docker ps -aq`

หรือ

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

3
ฉันคิดว่าคำตอบนี้เป็นอันตรายเพราะคำสั่งเหล่านั้นลบคอนเทนเนอร์ ประการแรก OP ถามว่าจะลบภาพอย่างไรไม่ใช่คอนเทนเนอร์ และที่สำคัญคำสั่งเหล่านั้นอาจทำให้ข้อมูลสูญหายเนื่องจากคนอาจมีข้อมูลที่มีค่าบางอย่างในคอนเทนเนอร์ที่ออก
u.unver34

คุณควรอธิบายผลลัพธ์ที่อาจไม่พึงประสงค์ของการใช้คำสั่งเหล่านี้บนเซิร์ฟเวอร์ที่ใช้งานจริง
แดเนียล

สิ่งนี้จะลบคอนเทนเนอร์ไม่ใช่รูปภาพ
SeF

1

บางครั้งฉันพบปัญหาที่นักเทียบท่าจะจัดสรรและใช้พื้นที่ดิสก์ต่อไปแม้ว่าจะไม่ได้จัดสรรพื้นที่ให้กับอิมเมจหรือคอนเทนเนอร์ที่มีอยู่ก็ตาม วิธีล่าสุดที่ฉันสร้างปัญหานี้โดยบังเอิญคือใช้ centos "นักสร้างเครื่องยนต์" สร้างแทนที่จะเป็น "นักเทียบท่า" ใน RHEL 7.1 สิ่งที่ดูเหมือนจะเกิดขึ้นคือบางครั้งการล้างข้อมูลคอนเทนเนอร์ไม่เสร็จสมบูรณ์จากนั้นพื้นที่จะไม่ถูกนำมาใช้ซ้ำ เมื่อไดรฟ์ 80GB ที่ฉันจัดสรรเป็น / เต็มไปด้วยไฟล์ / var / lib / docker ฉันต้องหาวิธีที่สร้างสรรค์เพื่อแก้ไขปัญหา

นี่คือสิ่งที่ฉันมาด้วย ก่อนอื่นให้แก้ไขข้อผิดพลาดของดิสก์ทั้งหมด:

  1. Stop docker: systemctl stop docker
  2. จัดสรรไดรฟ์ใหม่ที่เมาท์เป็น say / mnt / docker
  3. ย้ายไฟล์ทั้งหมดใน / var / lib / docker ไปที่ / mnt / docker ฉันใช้คำสั่ง: rsync -aPHSx - ลบซอร์สไฟล์ / var / lib / docker / / mnt / docker /
  4. เมานต์ไดรฟ์ใหม่ไปที่ / var / lib / docker

ณ จุดนี้ฉันไม่ได้มีข้อผิดพลาดเต็มรูปแบบของดิสก์อีกต่อไป แต่ฉันยังคงเปลืองพื้นที่จำนวนมาก ขั้นตอนต่อไปคือการดูแลสิ่งนั้น

  1. Start Docker: systemctl start docker

  2. บันทึกภาพทั้งหมด: นักเทียบท่าบันทึก $ (ภาพนักเทียบท่า | sed -e '/ ^ / d' -e '/ ^ REPOSITORY / d' -e 's, [] [] ,:,' -e 's, [ ]. ,, ')> /root/docker.img

  3. ถอนการติดตั้งนักเทียบท่า

  4. ลบทุกอย่างใน / var / lib / docker: rm -rf / var / lib / docker / [cdintv] *

  5. ติดตั้ง docker อีกครั้ง

  6. เปิดใช้งานนักเทียบท่า: systemctl เปิดใช้งานนักเทียบท่า

  7. Start docker: systemctl start docker

  8. คืนค่ารูปภาพ: โหลดนักเทียบท่า </root/docker.img

  9. เริ่มต้นคอนเทนเนอร์ถาวรใด ๆ ที่คุณต้องการใช้งาน

สิ่งนี้ทำให้การใช้งานดิสก์ของฉันลดลงจาก 67 GB สำหรับ docker เป็น 6 GB สำหรับ docker

ฉันไม่แนะนำให้ใช้ในชีวิตประจำวัน แต่จะมีประโยชน์ในการทำงานเมื่อดูเหมือนว่านักเทียบท่าได้สูญเสียการติดตามของพื้นที่ดิสก์ที่ใช้ไปแล้วไปยังข้อผิดพลาดของซอฟต์แวร์หรือการรีบูตที่ไม่คาดคิด


1

หากคุณต้องการโดยอัตโนมัติ / ทำความสะอาดเป็นระยะ ๆ meltwater/docker-cleanupเดินออกมาจากตู้คอนเทนเนอร์และภาพลบและปริมาณที่ไม่อยู่ในการใช้งานโดยภาชนะที่ทำงานคุณสามารถดาวน์โหลดภาพ

เพิ่งรัน:

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

มันทำงานทุก ๆ 30 นาทีโดยค่าเริ่มต้น อย่างไรก็ตามคุณสามารถตั้งค่าเวลาหน่วงได้โดยใช้การตั้งค่าสถานะนี้ในไม่กี่วินาที (ตัวเลือก DELAY_TIME = 1800)

รายละเอียดเพิ่มเติม: https://github.com/meltwater/docker-cleanup/blob/master/README.md


1

หากคุณสร้างอิมเมจที่ถูกตัดทิ้งเหล่านี้ด้วยตัวเอง (จากอิมเมจพื้นฐานอื่น ๆ ที่เก่ากว่า) โปรดใช้ความระมัดระวังกับโซลูชันที่ได้รับการยอมรับข้างต้นdocker image pruneเนื่องจากคำสั่งนั้นทื่อและจะพยายามลบการอ้างอิงทั้งหมดที่อิมเมจล่าสุดของคุณ อาจเปลี่ยนชื่อเป็นdocker image*s* prune)

วิธีแก้ปัญหาที่ฉันใช้สำหรับไพพ์ไลน์การสร้างอิมเมจของนักเทียบท่า (ที่มีบิลด์รายวันและแท็ก = วันที่อยู่ในYYYYMMDDรูปแบบ) คือ:

# 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

มีตัวเชื่อมปลั๊กอินนกกระจอก- ลบ -dangling-คุณสามารถใช้ในการทำความสะอาดภาชนะหยุดและภาพที่ไม่ได้ใช้ (ห้อย):

$ sparrow plg run docker-remove-dangling-images

มันทำงานได้ทั้งสำหรับ Linux และ Windows OS


0

ก่อนอื่นให้เรียกใช้docker imagesเพื่อดูรายการรูปภาพและคัดลอก IMAGE HASH ID ลงในคลิปบอร์ด

วิ่ง docker rmi -f <Image>

จำตัวเลือก-fคือการบังคับให้ลบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.