วิธีการลบคอนเทนเนอร์นักเทียบท่าเก่า


1235

คำถามนี้เกี่ยวข้องกับฉันควรจะกังวลเกี่ยวกับคอนเทนเนอร์ Docker ที่มากเกินไปและไม่ทำงานหรือไม่? .

ฉันสงสัยว่าจะลบคอนเทนเนอร์เก่าได้อย่างไร docker rm 3e552code34aช่วยให้คุณลบหนึ่งเดียว แต่ฉันมีจำนวนมากอยู่แล้ว docker rm --helpไม่ได้เลือกตัวเลือก (เช่นทั้งหมดหรือตามชื่อภาพ)

อาจมีไดเรกทอรีที่จัดเก็บคอนเทนเนอร์เหล่านี้ซึ่งฉันสามารถลบออกได้อย่างง่ายดายด้วยตนเอง?


21
คุณควรพิจารณาการทำความสะอาดวอลุ่มนักเทียบท่าที่กำพร้า ฉันมักจะพบว่าพวกเขากินเนื้อที่มากกว่าภาชนะเก่าและรูปภาพเก่า บทที่ดีสำหรับการลบไดรฟ์นักเทียบท่ากำพร้ามีอยู่ที่: github.com/chadoe/docker-cleanup-volumes
Nemanja Trifunovic

บางทีgithub.com/chadoe/docker-cleanup-volumesสามารถช่วยคุณได้
Mihai8

คุณยังสามารถใช้docker runกับการ--rmตั้งค่าสถานะซึ่งจะทำให้คอนเทนเนอร์ชั่วคราวลบแฟ้มคอนเทนเนอร์ทั้งหมดหลังจากการเรียกใช้
Gordon

12
ด้วยนักเทียบท่า 1.13 (Q4 2016) คุณสามารถพิจารณาdocker system pruneคำสั่งใหม่ ดูคำตอบของฉันด้านล่าง
VonC

1
ใช้เครื่องมือจัดการนักเทียบท่าPortainer เราสามารถจัดการได้all the old containers, non using volumes and imagesโดยใช้เครื่องมือนี้ UI การจัดการที่เรียบง่ายสำหรับนักเทียบท่า Please refer my update below on how to deploy the application
Anish Varghese

คำตอบ:


1460

ตั้งแต่Docker 1.13.xคุณสามารถใช้ลูกพรุนคอนเทนเนอร์ Docker :

docker container prune

สิ่งนี้จะลบคอนเทนเนอร์ที่หยุดทำงานทั้งหมดและควรทำงานบนแพลตฟอร์มทั้งหมดด้วยวิธีเดียวกัน

นอกจากนี้ยังมีการตัดระบบ Docker :

docker system prune

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


สำหรับเวอร์ชัน Docker ที่เก่ากว่าคุณสามารถสตริงคำสั่ง Docker พร้อมกับคำสั่ง Unix อื่น ๆ เพื่อให้ได้สิ่งที่คุณต้องการ นี่คือตัวอย่างเกี่ยวกับวิธีล้างภาชนะบรรจุเก่าที่มีอายุหลายสัปดาห์:

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

ที่จะให้เครดิตที่มันเป็นเพราะเช่นนี้มาจากhttps://twitter.com/jpetazzo/status/347431091415703552


92
คำสั่งที่คล้ายกันเพื่อลบภาพที่ไม่ติดแท็ก: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj

7
@ MichelMüllerเมื่อสร้างภาพจาก dockerfile คุณสามารถระบุ-rmตัวเลือกเพื่อลบคอนเทนเนอร์กลางหลังจากการสร้างสำเร็จ
Freek Kalter

3
@ MichelMüllerรูปภาพเป็นสิ่งที่ใช้สำหรับแคชดังนั้นการลบคอนเทนเนอร์จะไม่มีผลกระทบ
Ken Cochrane

7
หากคุณต้องการใช้ awk สำหรับคำสั่งนี้ให้พิจารณาคำสั่งนี้หากคุณต้องการให้ rm คอนเทนเนอร์ที่หยุดทำงานทั้งหมด (โดยไม่มีข้อผิดพลาดเนื่องจากบรรทัดแรก):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi

3
นี่ควรเป็นคำสั่งที่อัปเดตแล้วสำหรับการลบภาพที่ไม่ได้ติดแท็กdocker rmi $(docker images -q -f dangling=true)
Ghjnut

626

อีกวิธีหนึ่งซึ่งฉันได้รับจาก Guillaume J. Charmes (เครดิตเมื่อถึงกำหนดชำระ):

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

จะลบคอนเทนเนอร์ทั้งหมดด้วยวิธีที่สวยงาม

และโดย Bartosz Bilicki สำหรับ Windows:

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

สำหรับ PowerShell:

docker rm @(docker ps -aq)

การอัปเดตด้วย Docker 1.13 (ไตรมาสที่ 4 ปี 2559) ให้เครดิตกับVonC ( ต่อมาในหัวข้อนี้ ):

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

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

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
อย่างใดนี้ไม่ทำงานสำหรับฉัน แต่ได้docker ps -a -q | xargs docker rmผล (อาจจำเป็นต้องใช้ sudo)
FUD

86
แล้วdocker rm $(docker ps -a -q)ไงล่ะ
qkrijger

8
@qkrijger สิ่งนี้จะไม่เปลี่ยนแปลงอะไรเลยจากคำตอบเดิมของคุณยกเว้นการเพิ่ม bashism ปัญหาเกิดขึ้นกับล้นบรรทัดคำสั่ง ตัวแปร xargs เกี่ยวข้องกับมันในทางที่ดี ฉันยังจะเพิ่ม - ไม่มีลำตัวไปที่นักเทียบท่า ps เพื่อหลีกเลี่ยงการปะทะกันของ id (ไม่น่า)
Ihor Kaharlichenko

8
ระวังหากคุณใช้ที่เก็บข้อมูลเท่านั้นมันจะลบออกด้วย
Dzung Nguyen

4
ฉันไม่เห็นประเด็น--no-truncเพราะdocker rmไม่ต้องการรหัสเต็ม
Pithikos

411

อัปเดตคำตอบการ ใช้งานdocker system pruneหรือdocker container pruneตอนนี้ ดูคำตอบของการปรับปรุง VonC ของ

คำตอบก่อนหน้า การเขียนคำแนะนำต่าง ๆ ข้างต้นวิธีที่ดีที่สุดในการนำภาชนะที่ไม่ได้ใช้งานออกดูเหมือนจะเป็น:

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

  • -q พิมพ์เฉพาะรหัสคอนเทนเนอร์ (ไม่มีส่วนหัวคอลัมน์)
  • -f ช่วยให้คุณสามารถกรองรายการภาชนะบรรจุที่พิมพ์ของคุณ (ในกรณีนี้เรากรองเพื่อแสดงเฉพาะคอนเทนเนอร์ที่ออกแล้ว)

7
นี่ควรเป็นคำตอบที่ถูกต้องเพราะขึ้นอยู่กับนักเทียบท่าที่จะบอกคุณว่าคอนเทนเนอร์ใดที่ไม่ได้ใช้อีกต่อไปแทนที่จะสมมติว่ารูปแบบเอาต์พุตข้อความ $ (ภาพนักเทียบท่า) จะไม่เปลี่ยนแปลง คะแนนโบนัสสำหรับการวางไข่เพียงหนึ่งกระบวนการพิเศษแทนสอง
eurythmia

18
คุณอาจต้องการที่จะเพิ่มเพื่อหลีกเลี่ยงการห้อยปริมาณ:-v docker rm -v $(docker ps -q -f status=exited)ดูdocs.docker.com/userguide/dockervolumes/สำหรับรายละเอียดเกี่ยวกับห้อยต่องแต่ง
rluba

@rluba เห็นได้ชัดว่าใน Docker 1.9 จะมีไดรฟ์ข้อมูลแยกต่างหากสำหรับการจัดการปัญหานั้น github.com/docker/docker/pull/14242
Ryan Walls

นามแฝงอาจเป็นประโยชน์:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung

ต่างจากคำตอบที่ทำเครื่องหมายว่าถูกต้องคำตอบ @RyanWalls ทำงานบน OSX รวมถึงมีความรัดกุมมากกว่า
เรย์

255

วิธีการอย่างเป็นทางการคือ:

docker rm `docker ps -aq`

ผู้ดูแลนักเทียบท่าระบุว่าจะไม่มีคำสั่งสำหรับสิ่งนี้ - และคุณเขียนคำสั่งเช่นนั้น:

เราได้พูดถึงเรื่องนี้มาก่อนและต้องการให้ผู้ใช้ใช้บรรทัดด้านบนโดยไม่ต้องเพิ่มรหัสเพิ่มเติมให้กับ Docker


6
นี่เป็นวิธีการแก้ปัญหาที่ไม่ดีเนื่องจากมันจะลบคอนเทนเนอร์ที่เก็บข้อมูลด้วย
Sobrique

8
คุณหมายถึง "คอนเทนเนอร์จัดเก็บ" หมายความว่าอย่างไร หากคุณหมายถึงคอนเทนเนอร์แบบใช้ข้อมูลเท่านั้นซึ่งครั้งหนึ่งเคยถูกใช้เพื่อเก็บการอ้างอิงไปยังโวลุ่มข้อมูลเหล่านั้นไม่จำเป็นอีกต่อไปเนื่องจากความพร้อมใช้งานของคำdocker volumeสั่งย่อยและไดรฟ์ข้อมูลที่ตั้งชื่อ
L0j1k

โปรดทราบว่านี่จะไม่ทำงานภายใน Windows Powershell สำหรับสิ่งนี้เป็นทางออกที่ดีกว่า: stackoverflow.com/a/23674294/1150683
Bram Vanroy

@Sririque หากคุณไม่ตอบสนองอย่างน้อยคุณควรลบความคิดเห็นของคุณมันเกือบจะไร้สาระและเป็นอันตราย
peterh - Reinstate Monica

128

ด้วย Docker 1.13 (Q4 2016) ตอนนี้คุณมี:

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

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

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

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

ในฐานะที่เป็นความคิดเห็นwjv

นอกจากนี้ยังมีdocker {container,image,volume,network} pruneซึ่งอาจใช้เพื่อลบอินสแตนซ์ที่ไม่ได้ใช้ของวัตถุชนิดเดียวเท่านั้น

เปิดตัวในการกระทำ 913e5cbเฉพาะสำหรับนักเทียบท่า 1.13+

docker container prune

ขอบคุณสำหรับการแบ่งปัน - เพื่อให้มองเห็นได้ฉันกำลังอ้างอิงคุณในคำตอบที่สูงขึ้นในเธรด
qkrijger

ตามปกติเพิ่ม-fแฟล็กเพื่อบังคับให้ล้างข้อมูลโดยไม่ถามคำถาม
เดิร์

3
ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้องในปัจจุบันส่วนใหญ่ข้างต้นย้อนกลับไปในอดีต แต่เป็นเรื่องราวที่ซับซ้อนมากเกินไป
Eugen Mayer

ตกลงเร็วขึ้นมากขึ้นคุณไป!
Maxim Geerinck

คำอธิบายในบล็อครหัสมีไว้สำหรับdocker system prune -aลบรูปภาพที่ไม่ได้ใช้ docker system pruneลบเฉพาะภาพห้อยหรือภาพที่ไม่มีแท็ก
smilebomb

104

ตอนนี้เป็นไปได้ที่จะใช้การกรองด้วยdocker ps:

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

และสำหรับภาพ :

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

อย่างไรก็ตามสิ่งเหล่านี้จะทำให้เกิดdocker rmหรือdocker rmiโยนข้อผิดพลาดเมื่อไม่มีคอนเทนเนอร์ที่ตรงกัน docker rm $(docker ps -aq)กลเม็ดที่เก่ากว่านั้นแย่กว่าเดิมเพราะมันพยายามที่จะลบ container ที่กำลังวิ่งอยู่ซึ่งล้มเหลวในแต่ละอัน

นี่เป็นสคริปต์ที่สะอาดกว่าที่จะเพิ่มใน~/.bashrcหรือ~/.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
}

แก้ไข: ดังที่ระบุไว้ด้านล่างคำตอบดั้งเดิมสำหรับการลบภาพไม่ใช่ที่เก็บ อัปเดตเพื่อตอบทั้งสองรวมถึงลิงก์ใหม่ไปยังเอกสาร ขอบคุณ Adrian (และคำตอบของ Ryan) สำหรับการกล่าวถึงตัวpsกรองใหม่


2
สังเกตข้อได้เปรียบที่แท้จริงของสิ่งนี้ - คุณไม่ได้ตั้งใจฆ่าstorageนักทำ conatiners
Sobrique

3
คุณยังสามารถใช้status=createdเพื่อรับสิ่งที่ไม่ได้ทำงาน
enderland

96

อัปเดต 2019 (ใหม่ล่าสุด)

docker container prune

วิธีนี้ - 2017 (เก่า) วิธี

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

docker rm $(docker ps -a -q)

เมื่อต้องการลบคอนเทนเนอร์ทั้งหมด (หยุดและไม่หยุด)

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

3
downvoted เนื่องจากเป็นสิ่งที่แน่นอนว่าไม่ใช่วิธีการที่คุณทำในปี 2560 - จะเป็นdocker volume/container/image pruneอย่างไรโปรดดูstackoverflow.com/a/39860665/3625317
Eugen Mayer

6
เพิ่มขึ้นเพื่อตอบโต้ downvote เพราะก) คำตอบนี้มาจากปี 2559 และ b) ผู้คนจำนวนมากไม่ได้วิ่งตามขอบเลือดออก
คม

49

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

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

จากความคิดเห็นโดยpauk960 :

ตั้งแต่เวอร์ชั่น1.3.0คุณสามารถใช้ฟิลเตอร์ที่มีdocker psแทนการใช้งานgrep Exited docker ps -a -f status=exitedและถ้าคุณใช้-qกับมันคุณจะได้รับ ID คอนเทนเนอร์เท่านั้นแทนที่จะเป็นเอาท์พุทแบบเต็มไม่จำเป็นต้องใช้ awk สำหรับสิ่งนั้น


33

ถ้าคุณไม่ชอบที่จะเอาภาชนะที่ทุกท่านสามารถเลือกภาชนะทั้งหมดที่สร้างขึ้นก่อนหรือหลังตู้คอนเทนเนอร์ที่เฉพาะเจาะจงด้วยหรือdocker ps --before <container-ID> docker ps --since <container-ID>คุณลักษณะนี้เป็นอย่างน้อยใน Docker เวอร์ชัน 0.6.5

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

ลบคอนเทนเนอร์ที่สร้างก่อนหน้าคอนเทนเนอร์อื่น

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

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

ลบคอนเทนเนอร์ที่สร้างขึ้นหลังจากคอนเทนเนอร์ที่แน่นอน

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

นักเทียบท่าเก็บคอนเทนเนอร์ใน/var/lib/docker/containersใน Ubuntu ฉันคิดว่าคอนเทนเนอร์พิเศษไม่ทำอันตรายอะไร แต่ใช้พื้นที่ดิสก์


32

อัปเดต:ตั้งแต่ Docker เวอร์ชัน 1.13 (เผยแพร่เมื่อเดือนมกราคม 2017) คุณสามารถออกคำสั่งต่อไปนี้เพื่อล้างภาชนะที่หยุดทำงานปริมาณที่ไม่ได้ใช้รูปภาพที่ห้อยอยู่และเครือข่ายที่ไม่ได้ใช้:

docker system prune

หากคุณต้องการประกันว่าคุณจะลบเฉพาะคอนเทนเนอร์ที่มีexitedสถานะใช้สิ่งนี้:

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

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

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

22

นี่คือdocker-cleanupสคริปต์ของฉันซึ่งจะลบคอนเทนเนอร์และรูปภาพที่ไม่ได้ติดแท็ก โปรดตรวจสอบแหล่งที่มาสำหรับการปรับปรุงใด ๆ

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

ที่มา: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup


@BradMurray ขอบคุณ! คุณอาจจะชอบสิ่งเหล่านี้: github.com/blueyed/dotfiles/commit/
......

3
ไม่ทำงานบน OSX เนื่องจากxargs --no-run-if-emptyตัวเลือก
caktux

13

ก่อนอื่นให้หยุดเรียกใช้คอนเทนเนอร์ก่อนที่จะพยายามลบมันออก

ลบคอนเทนเนอร์ที่รันอยู่

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

คุณสามารถใช้แทนkill stopในกรณีของฉันฉันชอบstopเพราะฉันมักจะวิ่งใหม่และสร้างใหม่ทุกครั้งดังนั้นฉันจึงพยายามปิดมันลงอย่างสวยงาม

หมายเหตุ: การพยายามหยุดตู้คอนเทนเนอร์จะทำให้เกิดข้อผิดพลาด:

ข้อผิดพลาด: ไม่สามารถลบคอนเทนเนอร์ที่ใช้งานได้โปรดหยุดก่อน

นำภาชนะทั้งหมดออก

docker rm $(docker ps -a -q)

11

การลบคอนเทนเนอร์ทั้งหมดออกจากเชลล์ Windows:

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

ฉันจะรวมสิ่งนี้ไว้ในคำตอบตั้งแต่หน้าแรก ขอบคุณ
qkrijger

"จาก Windows shell"หรือไม่ คุณหมายถึง"using the Windows shell (CMD)"หรือไม่
ปีเตอร์มอร์เทนเซ่น

10

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

ล้างข้อมูลนักเทียบท่า

เชลล์ all-in-one ขนาดเล็กซึ่งจะลบ:

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

ตั้งใจที่จะทำงานเป็นงาน crontab

ลักษณะเฉพาะ

  • มันจะลบ<none>:<none>ภาพทั้งหมด
  • หากภาพมีหลาย repo: แท็กอ้างอิงถึงมันจะลบ repo ทั้งหมด: แท็กยกเว้นกับการใช้ภาชนะ ที่จริงมันเป็นธรรมชาติของ "นักเทียบท่า rmi"
  • ข้อความแสดงข้อผิดพลาดจำนวนมากจะแสดงบนหน้าจอและคุณสามารถตัดสินใจ2>/dev/nullได้หรือไม่
  • เรียนรู้บางอย่างจาก docker-gc และแก้ไขปัญหา (ไม่สามารถลบรูปภาพที่มี repliple repo: แท็ก)

9

ดังนั้นโดยส่วนตัวฉันแนะนำให้ทำเช่นนี้เป็นส่วนหนึ่งของสคริปต์การปรับใช้ของคุณสำหรับทั้งอิมเมจและคอนเทนเนอร์โดยเก็บเฉพาะคอนเทนเนอร์และอิมเมจล่าสุดเท่านั้น ฉันแท็กอิมเมจ Docker ของฉันด้วย schema การกำหนดเวอร์ชันเดียวกันกับที่ใช้git tagและติดแท็กอิมเมจล่าสุด Docker ด้วย "ล่าสุด" ซึ่งหมายความว่าไม่ต้องล้างอะไรเลยภาพ Docker ของฉันดูคล้ายกับ:

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

แน่นอนว่าตอนนี้ฉันไม่ต้องการให้รูปภาพของฉันทั้งหมด (หรือตู้คอนเทนเนอร์) กลับสู่ความเป็นอมตะในกล่องผลิตทั้งหมดของฉัน ฉันแค่ต้องการ 3 หรือ 4 สุดท้ายสำหรับการย้อนกลับและกำจัดทุกอย่างอื่น Unix's tailเป็นเพื่อนที่ดีที่สุดของคุณที่นี่ ตั้งแต่docker imagesและdocker psเรียงลำดับตามวันที่เราสามารถใช้tailเพื่อเลือกทั้งหมดยกเว้นสามอันดับแรกและลบออก:

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

เรียกใช้พร้อมกับสคริปต์การปรับใช้ของคุณ (หรือในเครื่อง) เพื่อเก็บภาพให้เพียงพอที่จะย้อนกลับได้อย่างสะดวกสบายโดยไม่ต้องใช้พื้นที่มากเกินไป

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

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

ในตัวอย่างที่เรียบง่ายของฉันเราจะจัดการกับที่เก็บครั้งละหนึ่งรายการเท่านั้น แต่ถ้าคุณมีมากขึ้นคุณก็จะมีความซับซ้อนมากขึ้นด้วยแนวคิดเดียวกัน สมมติว่าฉันต้องการเก็บภาพสามภาพล่าสุดจาก some_repo / some_image ฉันสามารถผสมในgrepและawkและจะอยู่ในทางของฉัน:

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

อีกครั้งความคิดเดียวกันนี้ใช้กับตู้คอนเทนเนอร์ แต่คุณจะได้รับภายในจุดนี้ดังนั้นฉันจะหยุดให้ตัวอย่าง


8

ใช้:

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

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


โปรดแก้ไขด้วยข้อมูลเพิ่มเติม รหัสเท่านั้นและคำตอบ "ลองนี้" จะหมดกำลังใจเพราะพวกเขาไม่มีเนื้อหาที่ค้นหาได้และไม่อธิบายว่าทำไมคนควร "ลองนี้" เราใช้ความพยายามที่นี่เพื่อเป็นแหล่งข้อมูลสำหรับความรู้
Brian Tompsett - 汤莱恩

ใน Ubuntu 16.04, นักเทียบท่าต้อง sudo sudo docker rm -f $(sudo docker ps -a -q)เพื่อให้คุณมีการเขียน
Elliott

เป็นบวกนี้ยังทำงานใน Windows ภายใต้ PowerShell!
Robert Ivanc

@Elliott ฉันคิดว่าsudoจำเป็นทุกที่ยกเว้นคุณเพิ่มผู้ใช้ของคุณในกลุ่ม 'นักเทียบท่า' ฉันใช้อูบุนตู 16.10 โดยไม่มี sudo โดยเพิ่มผู้ใช้ของฉันในกลุ่มนักเทียบท่า
emory

7

ลบ 5 คอนเทนเนอร์ที่เก่าแก่ที่สุด:

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

ดูจำนวนตู้ที่เหลืออยู่:

docker ps -aq | wc -l

Nice Job @Pithikos ฉันได้เพิ่มคำตอบที่ลบคอนเทนเนอร์เก่าทั้งหมด
Mostafa Ghadimi

7

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

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

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

ลบภาพที่ไม่ติดแท็กทั้งหมด

ตอนนี้คุณต้องการล้างรูปภาพเก่าเพื่อประหยัดพื้นที่

sudo docker rmi $ (ภาพ sudo docker -q --filter "dangling = true")


อย่าลืมลบโวลุ่มนักเทียบท่าด้วยการระบุตัวเลือก -v (sudo docker rm -v $ (sudo
docker

ไม่ได้ดูเรื่องนี้ แต่ฉันเดาเหมือน:docker ps -aq | xargs docker rm -v
quine

สิ่งนี้ใช้ได้กับ Linux ไม่ใช่ Windows ... แต่docker rm -f $(docker ps -a -q)ทำงานใน PowerShell / Docker สำหรับ Windows
Peter Mortensen

6

วิธีใหม่: spotify / docker-gc เล่นเล่ห์เหลี่ยม

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • ภาชนะบรรจุที่ออกจากเกินกว่าหนึ่งชั่วโมงที่ผ่านมาจะถูกลบออก
  • รูปภาพที่ไม่ได้เป็นของคอนเทนเนอร์ที่เหลืออยู่หลังจากนั้นจะถูกลบออก

รองรับการตั้งค่าสภาพแวดล้อม

บังคับให้ลบรูปภาพที่มีหลายแท็ก

 FORCE_IMAGE_REMOVAL=1

บังคับให้ลบคอนเทนเนอร์

 FORCE_CONTAINER_REMOVAL=1 

ไม่รวมคอนเทนเนอร์และรูปภาพที่ออกจากการรวบรวมขยะเมื่อเร็ว ๆ นี้

 GRACE_PERIOD_SECONDS=86400

การตั้งค่านี้ยังป้องกันการลบภาพที่สร้างขึ้นน้อยกว่า GRACE_PERIOD_SECONDS วินาทีที่ผ่านมา

แห้ง

 DRY_RUN=1

ทำความสะอาดวอลุ่มคอนเทนเนอร์ orphaned CLEAN_UP_VOLUMES = 1

การอ้างอิง: docker-gc

วิธีการทำแบบเก่า:

ลบคอนเทนเนอร์เก่าที่ไม่ได้ใช้งานอยู่

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

ลบรูปภาพทั้งหมดที่เกี่ยวข้องกับคอนเทนเนอร์ของนักเทียบท่าที่ไม่ได้ทำงานอยู่

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

ล้างวอลุ่มนักเทียบท่า orphaned สำหรับนักเทียบท่ารุ่น 1.10.x และสูงกว่า

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

ตามระยะเวลา

 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
ทางเลือกที่น่าสนใจ +1
VonC

6
  1. ลบกระบวนการนักเทียบท่าทั้งหมด:

    docker rm $(docker ps -a -q)
    
  2. ลบคอนเทนเนอร์เฉพาะ:

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

5

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อลบคอนเทนเนอร์ที่ออกแล้ว:

docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)

นี่คือส่วนสำคัญที่เต็มไปยังเอาภาพเก่านักเทียบท่า: สรุปสาระสำคัญที่จะเอาตู้คอนเทนเนอร์หางเก่าและภาพ


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

สำหรับผู้ที่ไม่ต้องการค้นหาด้วยตัวเองgithub.com/spotify/docker-gc
grim

มันสมบูรณ์แบบ. ฉันยังเขียนคำตอบที่มีฟังก์ชั่นเหมือนกัน
Mostafa Ghadimi

3

ฉันมักจะใช้docker rmi $(docker ps -a -q)เพื่อลบภาพทั้งหมด

คุณสามารถลบไดเรกทอรี/var/lib/docker/graphเมื่อdocker rmiล้มเหลว


ขอบคุณที่เพิ่มข้อมูล / var / lib /
docker

คำถามคือวิธีการลบคอนเทนเนอร์ไม่ใช่รูปภาพ
pauk960

3

คุณสามารถลบเฉพาะคอนเทนเนอร์ที่หยุด หยุดพวกเขาทั้งหมดในการเริ่มต้น

docker stop $(docker ps -a -q)

จากนั้นคุณสามารถลบ

docker rm $(docker ps -a -q)


3

ลองใช้คำสั่งนี้เพื่อล้างภาชนะบรรจุและรูปภาพที่ห้อยอยู่

docker system prune -f

นี่คือเคล็ดลับระดับมืออาชีพที่น่าทึ่ง!
b01

3

ขั้นตอนพื้นฐานเพื่อหยุด / ลบคอนเทนเนอร์และรูปภาพทั้งหมด

  1. รายการภาชนะทั้งหมด

    docker ps -aq

  2. หยุดคอนเทนเนอร์ที่รันอยู่ทั้งหมด

    docker stop $(docker ps -aq)

  3. นำภาชนะทั้งหมดออก

    docker rm $(docker ps -aq)

  4. ลบภาพทั้งหมด

    docker rmi $(docker images -q)

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


2

สำหรับทุกคนที่สนใจฉันเอาตัวอย่างจาก qkrijger และทำให้มันกลายเป็นชัดเจนทั้งหมด (หยุดและลบทั้งหมด)

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

หากคุณกำลังนำตู้คอนเทนเนอร์ออกไปแสดงว่าdocker rm -f $(docker ps --no-trunc -aq)เร็วขึ้น
qkrijger

จริง แต่ถ้าคุณต้องการให้ผ่านการปิดระบบที่เหมาะสมเพื่อล้างทรัพยากรที่ใช้ร่วมกันหรือนำกลับมาใช้ใหม่ (เช่นวอลุ่มที่แนบมาการเชื่อมต่อที่ใช้งานที่ปิดอย่างถูกต้อง ฯลฯ ) คุณต้องโทรหยุดก่อน ตัวอย่างที่ดีถ้าคุณมีภาชนะบรรจุเจนกินส์การฆ่าภาชนะนั้นเป็นความคิดที่ไม่ดี คุณต้องการให้มันบันทึกการเปลี่ยนแปลงที่ไม่มีการเตือนเตือนผู้ใช้ที่ล็อกอินและที่สำคัญต้องหยุดการสร้างทั้งหมด
Kraig McConaghy

ตกลงว่าเป็นกรณีการใช้ที่ถูกต้องมาก
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
เมื่อคุณตอบคำถามจะเป็นการดีที่สุดที่จะมีคำอธิบายเกี่ยวกับวิธีการแก้ปัญหาไม่ใช่แค่การถ่ายโอนรหัสมิฉะนั้นคำตอบอาจถูกลบ
AlBlue


2

ฉันกำลังใช้:

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

เพื่อลบคอนเทนเนอร์ที่ออกและ:

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

เพื่อกำจัดภาพที่ไม่ได้ติดแท็กทั้งหมด

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