มีวิธีลบรูปภาพใน Docker อย่างไร


840

ฉันใช้นักเทียบท่าภายใต้ Vagrant ภายใต้ OS X 10.8.4 (Mountain Lion) และทุกครั้งที่ฉันพยายามลบภาพที่บันทึกไว้ฉันได้รับข้อผิดพลาด:

$ docker rmi some-image-id
2013/07/15 hh:mm:ss unexpected JSON input

ตามความrmiช่วยเหลือไวยากรณ์ที่เหมาะสมคือdocker rmi IMAGE [IMAGE...]และฉันไม่แน่ใจว่าจะทำอย่างไร

ฉันจะลบภาพได้อย่างไร

$ docker version
Client version: 0.4.8
Server version: 0.4.8
Go version: go1.1

 

$docker info
Containers: 1
Images: 3

ที่น่าสนใจเมื่อฉันวิ่งdocker psไม่มีตู้คอนเทนเนอร์ปรากฏขึ้นเลย การวิ่งdocker imagesแสดงภาพสี่ (4) baseภาพและภาพหนึ่ง (1) nodeภาพ


1
คุณกำลังใช้นักเทียบท่ารุ่นใด คุณสามารถวางผลลัพธ์ของ 'นักเทียบท่ารุ่น' และ 'นักเทียบท่าข้อมูล' ได้หรือไม่? ฉันแค่ลองกับเจ้านายและก็ใช้ได้ดี
creack

ฉันได้อัปเดตคำถามด้วยข้อมูลนั้น
จูลส์

1
docker infoแสดงจำนวนภาพที่แท้จริงคุณสามารถลอง./docker images -a -q | sort | uniq | wc -lใช้ผลลัพธ์เดียวกัน (-a สำหรับรูปภาพทั้งหมด -q สำหรับรหัสเท่านั้น) docker psแสดงเฉพาะคอนเทนเนอร์ที่แอ็คทีฟคุณสามารถทำdocker ps -aรายการคอนเทนเนอร์ทั้งหมดได้
creack

คุณสามารถลองเริ่ม docker daemon พร้อม-Dตัวเลือกและไคลเอนต์ได้หรือไม่? docker -d -D& ; docker -D rmi <id>. คุณลองได้CID=$(docker run -d ubuntu bash); ID=$(docker commit $CID); docker rmi $IDไหม
creack

4
ดูคำขอดึงนี้: github.com/dotcloud/docker/pull/1225
creack

คำตอบ:


1013

ลองdocker rmi nodeดู ว่าควรจะทำงาน

docker ps -aเห็นตู้คอนเทนเนอร์ทั้งหมดที่สร้างขึ้นเป็นง่ายๆเป็น

หากต้องการลบคอนเทนเนอร์ที่มีอยู่ทั้งหมด (ไม่ใช่ภาพ!) ให้เรียกใช้ docker rm $(docker ps -aq)


13
หากคอนเทนเนอร์ของคุณบางส่วนยังคงทำงานอยู่คุณสามารถเรียกใช้: docker stop $ (docker ps -qa) เพื่อหยุดคอนเทนเนอร์ทั้งหมด ฉันคิดว่าการลบคอนเทนเนอร์ที่ทำงานอยู่อาจไม่ทำงานอย่างน้อยฉันจำได้ว่าฉันมีปัญหากับสิ่งนี้ ฉันอาจผิดเธอ ... ฉันได้ตรวจสอบหน้า man และสนับสนุนสมมติฐานของฉัน: "-f, --force = true | false การบังคับให้ลบคอนเทนเนอร์ที่ใช้งานอยู่ค่าเริ่มต้นคือ false"
Konrad Kleine

1
อาฉันไม่รู้เกี่ยวกับคำสั่งสำหรับ "ลบคอนเทนเนอร์ที่มีอยู่ทั้งหมด" มีการเขียนของตัวเอง: นักเทียบท่า ps -a | sed -r 's / ^ (\ w +). * / \ 1 / g' | sed -r 's / ^ CONTAINER //' | sed -r 's / ^ (\ w +) / docker rm \ 1 / g' | ขอบคุณ 'ระบบ ($ 0)' ขอบคุณ!
Anurag

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

ในการลบภาพที่มีอยู่ทั้งหมดคุณสามารถใช้ - "นักเทียบท่า rmi $ (ภาพนักเทียบท่า -q)"
มนุษย์

ในการลบคอนเทนเนอร์ที่มีอยู่ทั้งหมดโดยใช้ windows powershell: docker ps -aq | Foreach-Object { docker stop $_; docker rm $_; }
fartwhif

565

ต่อไปนี้เป็นวิธีในการลบอิมเมจ / คอนเทนเนอร์ของนักเทียบท่า:

ลบภาพเดียว

docker rmi image_name:version/image-id

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

docker rmi $(docker images -qf "dangling=true")

ฆ่าภาชนะบรรจุและนำออก:

docker rm $(docker kill $(docker ps -aq))

หมายเหตุ: แทนที่killด้วยstopสำหรับการปิดระบบอย่างงดงาม

ลบภาพทั้งหมดยกเว้น "my-image"

ใช้ grep เพื่อลบทั้งหมดยกเว้นmy-imageและubuntu

docker rmi $(docker images | grep -v 'ubuntu\|my-image' | awk {'print $3'})

หรือ(โดยไม่ต้อง awk)

docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))


25
เพิ่มเติม: ลบภาพ "ห้อย" (ภาพที่ไม่มีแท็ก):docker rmi $(docker images -qf "dangling=true")
kolypto

5
shoudl เป็นdocker rm $(docker kill $(docker ps -a -q))
BMW

1
"ลบทั้งหมดยกเว้น" โดยไม่ต้อง awk:docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))
phobie

1
@kolypto "dangling = true" ดูเหมือนว่าจะไม่ได้ลบคอนเทนเนอร์ที่ไม่ได้ห้อยอยู่ รันอีกครั้งลบแฟล็ก -f และ dangling เพื่อลบส่วนที่เหลือ
DougW

1
มันเป็นเพียงฉันหรือว่าคำแนะนำสุดท้าย (หรือ (โดยไม่ต้อง awk)) ไม่ทำงานจริง ๆ
Mike Wise

196

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

docker rm $(docker ps -a -q)

ลบภาพนักเทียบท่าทั้งหมด

docker rmi $(docker images -q)

7
ลบภาพที่ไม่ติดแท็ก:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
Barrett Clark

1
eq8.eu/blogs/23-spring-cleaning-for-webdevelopers sudo docker rmi -f $(sudo docker images | grep "<none>" | awk "{print \$3}")แล้วลบแท็กเผยแพร่สดของปี 2015 (เช่นlive-20150121223) เราทำได้ sudo docker rmi -f $(sudo docker images | grep live-2015 | awk "{print \$3}")
เทียบเท่า

เพื่อบังคับให้คุณต้องเขียน: นักเทียบท่า -f rm $ (นักเทียบท่า ps -a -q)
Adrian Lopez

71

ในการลบภาพออกจาก Docker โดยใช้รหัสรูปภาพ:

  1. รับรายการรูปภาพทั้งหมด

    docker images
    
  2. ระบุรหัสรูปภาพของภาพที่คุณต้องการลบตัวอย่างเช่น:

    REPOSITORY     TAG     IMAGE ID        CREATED        VIRTUAL SIZE
    kweku360/java  latest  08d3a9b8e166    2 weeks ago         5.733 GB`
    
  3. ในที่สุดก็ลบภาพโดยใช้รหัสภาพ (ต้องเป็นตัวเลขสามหลักแรกเท่านั้น)

    docker rmi 08d
    

1
ก่อนอื่นต้องหยุดคอนเทนเนอร์และลบออกอ้างถึงstackoverflow.com/questions/21398087/ …
vikramvi

37

ภาพ:

  1. แสดงรายการรูปภาพ

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

  2. ลบหนึ่งภาพ

    นักเทียบท่า rmi image_name

  3. บังคับลบภาพเดียว

    นักเทียบท่า rmi -f image_name

คอนเทนเนอร์:

  1. แสดงรายการคอนเทนเนอร์ทั้งหมด

    นักเทียบท่า ps -a

  2. ลบหนึ่งคอนเทนเนอร์

    นักเทียบท่า rm container_id

  3. บังคับให้นำภาชนะหนึ่งอันออก

    นักเทียบท่า rm -f container_id


29

ปรับปรุงตามที่แสดงความเห็นโดย VonC ในวิธีการเอาตู้คอนเทนเนอร์หางเก่า

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

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

ขอขอบคุณสำหรับคำตอบอย่างละเอียด แต่นี่ไม่ได้ตอบคำถามเดิมโดยตรง (ซึ่งได้รับคำตอบแล้วและคำตอบยอดนิยมยังคงเกี่ยวข้อง)
จูลส์

2
ฉันเห็นด้วย. อย่างไรก็ตามเนื่องจากชื่อของคำถามนี้เป็นคำถามทั่วไปซึ่งเป็นคำถามอ้างอิงดังนั้นฉันคิดว่าการให้ข้อมูลเกี่ยวกับกลไกจะเกิดขึ้น
qkrijger

24

การลบตู้คอนเทนเนอร์

  1. เพื่อลบภาชนะที่เฉพาะเจาะจง

    docker rm CONTAINER_ID CONTAINER_ID
    
    • สำหรับภาพเดียว

      docker rm  70c0e19168cf
      
    • สำหรับหลายภาพ

      docker rm  70c0e19168cf c2ce80b62174
      
  2. ลบคอนเทนเนอร์ที่ออก

    docker ps -a -f status=exited
    
  3. นำภาชนะทั้งหมดออก

    docker ps -q -a | xargs docker rm
    


การลบภาพ

docker rmi IMAGE_ID
  1. ลบภาพที่เฉพาะเจาะจง

    • สำหรับภาพเดียว

      docker rmi ubuntu
      
    • สำหรับหลายภาพ

      docker rmi ubuntu alpine
      
  2. ลบรูปภาพที่ห้อยอยู่รูปภาพที่ห้อย
    เป็นเลเยอร์ที่ไม่มีความสัมพันธ์กับภาพที่ติดแท็กเนื่องจากรูปภาพของนักเทียบท่าประกอบด้วยหลายภาพ

    docker rmi -f $(docker images -f dangling=true -q)
    
  3. ลบภาพนักเทียบท่าทั้งหมด

    docker rmi -f $(docker images -a -q)
    

การลบไดรฟ์

หากต้องการแสดงรายการปริมาณให้เรียกใช้ docker volume ls

  1. ลบไดรฟ์ข้อมูลที่เฉพาะเจาะจง

    docker volume rm VOLUME_NAME
    
  2. ลบโวลุ่มที่ห้อยอยู่

    docker volume rm $(docker volume ls -f dangling=true -q)
    
  3. ลบคอนเทนเนอร์และวอลุ่มของมัน

    docker rm -v CONTAINER_NAME
    

ทำไมคู่CONTAINER_ID?
Peter Mortensen

19

docker rm container_name

docker rmi image_name

docker help

rm ลบหนึ่งหรือมากกว่าคอนเทนเนอร์

rmi ลบภาพหนึ่งภาพขึ้นไป


ขอบคุณ แต่คำถามนี้มีหลายคำตอบอยู่แล้วและคำตอบที่เลือกซึ่งแก้ไขปัญหาได้เกือบ 3 ปีที่แล้ว
จูลส์

13
docker rmi  91c95931e552

การตอบสนองข้อผิดพลาดจาก daemon: ความขัดแย้งไม่สามารถลบ 91c95931e552 เนื่องจากคอนเทนเนอร์ 76068d66b290 กำลังใช้งานอยู่ใช้ -f เพื่อบังคับใช้ FATA [0000] ข้อผิดพลาด: ไม่สามารถลบภาพหนึ่งภาพขึ้นไป

ค้นหา ID คอนเทนเนอร์

# docker ps -a

# docker rm  daf644660736 

นั่นคือคำตอบของคำถามหรือไม่
Peter Mortensen

ทำไมdaf644660736? สิ่งนี้เกี่ยวข้องกับสิ่งใดก่อนหน้านี้อย่างไร
Peter Mortensen

5

ก่อนอื่นเราต้องหยุดและลบภาชนะ Docker ที่ติดกับอิมเมจ Docker ที่เราจะลบออก

ดังนั้นก่อนอื่น

  • docker stop container-id - เพื่อหยุดภาชนะที่ใช้งาน
  • docker rm container-id - วิธีการลบ / ลบคอนเทนเนอร์

แล้ว

  • docker rmi image-id - เพื่อลบ / ลบภาพ

3

สำหรับรุ่น 1.13 และสูงกว่า:

docker image rm [OPTIONS] IMAGE [IMAGE...]

เปรียบเทียบ:

[OPTIONS]ดูเหมือนจะมีไม่แตกต่างกัน

--force , -f        Force removal of the image
--no-prune          Do not delete untagged parents

จาก: แนะนำ Docker 1.13

ปรับโครงสร้าง CLI

ใน Docker 1.13 เราจัดกลุ่มคำสั่งทุกคำสั่งเพื่อให้อยู่ภายใต้วัตถุลอจิคัลที่โต้ตอบกับมัน ตัวอย่างlistและstartบรรจุอยู่ในขณะนี้ subcommands ของdocker containerและเป็นของhistory subcommanddocker image

การเปลี่ยนแปลงเหล่านี้ให้เราทำความสะอาดไวยากรณ์ Docker CLI ปรับปรุงข้อความช่วยเหลือและทำให้ Docker ใช้งานง่ายขึ้น ไวยากรณ์คำสั่งเก่ายังคงได้รับการสนับสนุน แต่เราขอแนะนำให้ทุกคนที่จะนำมาใช้ไวยากรณ์ใหม่


3

imagesเทียบท่าให้คำสั่งบางอย่างที่จะลบ

แสดง / ลบImages:

docker images
docker images -a # All images
docker images --no-trunc # List the full length image IDs

docker images --filter "dangling=true" // Show unstage images
docker rmi $(docker images -f "dangling=true" -q) # Remove on unstages images

docker rmi <REPOSITORY> or <Image ID> # Remove a single image

docker image prune # Interactively remove dangling images
docker image prune -a # Remove all images

or 

docker rmi -f $(sudo docker images -a -q)

นอกจากนี้คุณยังสามารถใช้filterพารามิเตอร์เพื่อลบชุดของภาพในครั้งเดียว:

ตัวอย่าง:

$docker images --filter "before=<hello-world>" // It will all images before hello-world

$docker images --filter "since=<hello-world>" // It will all images since hello-world

ดังนั้นคุณสามารถลบภาพตัวกรองเช่นนี้:

docker rmi $(docker images --filter "since=<hello-world>")
docker rmi $(docker images --filter "before=<hello-world>")

1

ลบทั้งหมดโดยใช้

ขั้นตอนที่ 1: ฆ่าตู้คอนเทนเนอร์ทั้งหมด

for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker kill $i ; done

ขั้นตอนที่ 2: RM พวกเขาก่อน

for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker rm $i ; done

ขั้นตอนที่ 3: ลบภาพโดยใช้แรง

for i in `sudo docker images | awk '{ print $3}'`; do  sudo docker rmi --force $i ; done

ใช้ขั้นตอนที่ 1 ในกรณีที่คุณได้รับข้อผิดพลาดว่าไม่สามารถลบได้เนื่องจากการพึ่งพาของเด็ก


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-rmi และเรียกใช้โดยใช้ 'docker-rmi my-image-name'

#!/bin/bash

IMAGE=$1

if [ "$IMAGE" == "" ] ; then
  echo "Missing image argument"
  exit 2
fi

docker ps -qa -f "ancestor=$IMAGE" | xargs docker rm
docker rmi $IMAGE

คุณต้องxargs -rทำให้มันทำงานในกรณีที่ไม่มีคอนเทนเนอร์ที่ตรงกัน
ตาม

0

ทำไมไม่มีใครพูดถึงdocker-compose! ฉันเพิ่งจะใช้มันเป็นเวลาหนึ่งสัปดาห์และฉันไม่สามารถอยู่รอดได้หากไม่มีมัน สิ่งที่คุณต้องมีคือการเขียน yml ซึ่งใช้เวลาเรียนเพียงไม่กี่นาทีจากนั้นคุณก็พร้อมที่จะไป มันสามารถบูตอิมเมจคอนเทนเนอร์ (ซึ่งจำเป็นในบริการที่เรียกว่า) และให้คุณตรวจสอบบันทึกเช่นเดียวกับที่คุณใช้กับคำสั่งดั้งเดิมของนักเทียบท่า ลองดูสิ:

docker-compose up -d
docker-compose down --rmi 'local'

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


docker-composeเป็นเครื่องมือ orchestration และมักจะทำไม่ได้เพื่อใช้ในโครงการง่าย ๆ dockerโซลูชันแบบสแตนด์อโลน(ไม่ต้องการใช้การกำหนดค่าบ่อยครั้ง - finnicky docker-compose.yml) จะดีกว่าในบริบทของคำถามนี้ นอกจากนี้ยังมีคำตอบที่ดีมากมายที่นี่แล้ว
จูลส์

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

-1

สำหรับฉันต่อไปนี้ทำงานได้ดี:

> docker images
REPOSITORY   TAG           IMAGE ID          CREATED             SIZE
debian       jessie        86baf4e8cde9      3 weeks ago         123MB
ubuntu       yakkety       7d3f705d307c      3 weeks ago         107MB
alpine       3.5           074d602a59d7      7 weeks ago         3.99MB

จากนั้นไปข้างหน้าและลบภาพโดยเรียกใช้บางอย่างเช่น:

> docker rmi debian:jessie
> docker rmi ubuntu:yakkety
> docker rmi alipine:3.5

-1

แสดงรายการรูปภาพ:

ahanjura@ubuntu:~$ sudo docker images

ขนาดแท็ก RepOSITORY TAG IMAGE ขนาด 88282f8eda00 19 วินาทีที่ผ่านมา 308.5 MB 13e5d3d682f4 19 ชั่วโมงที่แล้ว 663 MB busybox2 ล่าสุด 05fe66bb1144 20 ชั่วโมงที่ผ่านมา 1.129 MB Ubuntu 16.04 00fd29ccc6f1 busybox ล่าสุด 6ad733544a63 6 สัปดาห์ที่ผ่านมา 1.129 MB ubuntu 16.10 7d3f705d307c 5 เดือนที่ผ่านมา 106.7 MB

ลบภาพ:

ahanjura@ubuntu:~$ sudo docker rmi 88282f8eda00

ลบ: SHA256: 88282f8eda0036f85b5652c44d158308c6f86895ef1345dfa788318e6ba31194 ลบ: SHA256: 4f211a991fb392cd794bc9ad8833149cd9400c5955958c4017b1e2dc415e25e9 ลบ: SHA256: 8cc6917ac7f0dcb74969ae7958fe80b4a4ea7b3223fc888dfe1aef42f43df6f8 ลบ: SHA256: b74a8932cff5e61c3fd2cc39de3c0989bdfd5c2e5f72b8f99f2807595f8ece43

ahanjura@ubuntu:~$ sudo docker rmi 13e5d3d682f4

การตอบสนองข้อผิดพลาดจาก daemon: ข้อขัดแย้ง: ไม่สามารถลบ 13e5d3d682f4 (ต้องบังคับ) - รูปภาพกำลังถูกใช้โดยคอนเทนเนอร์ที่หยุด 5593e25eb638

ลบด้วยแรง:

ahanjura@ubuntu:~$ sudo docker rmi -f 13e5d3d682f4

ลบ: SHA256: 13e5d3d682f4de973780b35a3393c46eb314ef3db45d3ae83baf2dd9d702747e ลบ: SHA256: 3ad9381c7041c03768ccd855ec86caa6bc0244223f10b0465c4898bdb21dc378 ลบ: SHA256: 5ccb917bce7bc8d3748eccf677d7b60dd101ed3e7fd2aedebd521735276606af ลบ: SHA256: 18356d19b91f0abcc04496729c9a4c49e695dbfe3f0bb1c595f30a7d4d264ebf


-1

ในกรณีของฉันปัญหาคือฉันมีรูปพ่วงโดยใช้ชื่อเดียวกันวิธีแก้ไขคือการเพิ่มแท็กหลังชื่อหรือรหัส

sudo docker rmi <NAME>:<TAG>

อดีต:

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