ไม่สามารถลบภาพนักเทียบท่าที่มีรูปภาพลูกตาม


164

ฉันกำลังพยายาม

docker rmi c565603bc87f

ข้อผิดพลาด:

การตอบสนองข้อผิดพลาดจาก daemon: ข้อขัดแย้ง: ไม่สามารถลบ c565603bc87f (ไม่สามารถบังคับได้) - รูปภาพมีภาพลูกที่ขึ้นอยู่กับ

ดังนั้นฉันจึงไม่สามารถลบภาพได้แม้จะมีการตั้งค่าสถานะ -f วิธีการลบภาพแล้วและลูก ๆ ของมันทั้งหมด?

รุ่น Linux และ Docker:

uname -a Linux goracio-pc 4.4.0-24-generic # 43-Ubuntu SMP พุธ 8 มิถุนายน 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

รุ่นนักเทียบท่าไคลเอ็นต์: เวอร์ชัน: 1.11.2 รุ่น API: 1.23 รุ่น Go: go1.5.4 คอมไพล์คอมมิต: b9f10c9 สร้าง: พุธ มิ.ย. 1 22:00:43 2016 OS / Arch: linux / amd64

เซิร์ฟเวอร์: รุ่น: 1.11.2 รุ่น API: 1.23 รุ่น Go: go1.5.4 Git คอมมิท: b9f10c9 สร้าง: พุธ Jun 1 22:00:43 2016 OS / Arch: linux / amd64



2
ลบด้วยแท็กจากรายการใหม่สุดไปหาเก่าที่สุด หากพวกเขาอาศัยอยู่ใน repo พวกเขาจะถูกดึงถ้า Dockerfile ใด ๆ ที่ต้องการพวกเขา
rafaelbattesti

คุณควรยอมรับคำตอบที่ดีมากเหงียนให้
jpw

คำตอบ:


119

คุณควรพยายามลบภาพที่ไม่จำเป็นออกก่อนที่จะลบภาพ:

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

หลังจากนั้นให้เรียกใช้:

docker rmi c565603bc87f

13
ไม่มีภาพที่ห้อยอยู่ ... ภาพนักเทียบท่า -f dangling = จริง -> ไม่มีอะไร
Roman

39
คำตอบนี้ตอบคำถามต่าง ๆ "ฉันจะลบรูปห้อยได้อย่างไร" คำถามของ OP คือ "ฉันจะลบรูปภาพอ้างอิงได้อย่างไร"
tu-Reinstate Monica-dor duh

6
หากต้องการลบภาพที่ห้อยอยู่เพียงแค่ใช้prune
Deqing

17
คำสั่งนั้นใช้งานไม่ได้อีกต่อไป:> "docker rmi" requires at least 1 argument.
samayo

2
@samayo --filter=dangling=trueถ้าคุณได้รับข้อผิดพลาดที่ลองเปลี่ยนส่วนกรองเพื่อ: หากคุณยังคงได้รับข้อผิดพลาดนั่นหมายความว่าคุณไม่มีภาพที่ห้อยอยู่และดังนั้นคำสั่งในชุดจะประเมินเป็นสตริงว่าง
HammerN'Songs

100

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

หากคุณมีแท็กที่ซ้ำซ้อนตามที่อธิบายไว้ที่นี่แทนที่จะdocker rmi <image_id>ใช้docker rmi <repo:tag>กับแท็กที่ซ้ำซ้อนที่คุณต้องการลบ


11
docker rmi <repo:tag>ได้ผลสำหรับฉันคำตอบของคุณค่อนข้างง่ายในบรรดาคำตอบ
Shihe Zhang

นี่ควรเป็นวิธีที่ถูกต้องในการทำเช่นนั้นสำหรับกรณีของฉันกับภาพเก่าแก่ที่ห่างไกลจากโกลัน
วิหาร

นี่คือตั๋วสำหรับฉันขอบคุณ Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

หากใครติดตั้งตัวอย่างeShopOnContainersของ Microsoft คุณจะต้องลบแต่ละอันด้วยวิธีนี้repo:tagเพราะสร้างรูปภาพที่ติดแท็กแปดภาพที่แชร์เพียงสองภาพ id แม้ Visual Studio จะไม่ลบพวกเขาในการจัดการหน้าต่างภาชนะที่ใช้บรรจุ ...
mdisibio

คำสั่งdocker rmi <repo:tag>เพียงปลดแท็กมันไม่จำเป็นต้องลบภาพ หากมีมากกว่าหนึ่งแท็กที่อ้างอิงภาพนี้หรือหากมีปัญหาอื่นเช่นเช่นที่ระบุโดย OP ภาพจะยังคงอยู่ที่นั่น docker images ls --allคุณสามารถตรวจสอบภาพที่ยังคงมีอยู่กับคำสั่ง
twan163

50

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

docker rmi $(docker images -q) -f

ป้อนคำอธิบายรูปภาพที่นี่


1
สิ่งนี้ได้ผลสำหรับฉัน ฉันแค่อยากจะระเบิดรูปท้องถิ่นทั้งหมดของฉัน หมายเหตุฉันต้องอัปเดตเพื่อใช้งานกับเวอร์ชัน docker ของฉัน (18.09.7): docker image rm $(docker image ls -a -q) -f
akagixxer

40

ค้นหารหัสรูปภาพและรหัสหลักสำหรับรูปภาพทั้งหมดที่สร้างขึ้นหลังจากรูปภาพที่เป็นปัญหาดังต่อไปนี้:

docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)

จากนั้นคุณเรียกคำสั่ง:

docker rmi {sub_image_id} 

"sub_image_id" เป็นรหัสของภาพที่ขึ้นต่อกัน


ดีมากที่จะลบภาพกลางของภาพที่เฉพาะเจาะจง ขอบคุณ !!
A.Villegas

ธงที่ไม่รู้จัก - ตัวกรอง: /
SamuraiJack

นี่น่าจะเป็นทางออกที่แท้จริงสำหรับคำถาม!
เปาโล

28

สิ่งที่ทำงานกับฉันคือการใช้ REPOSITORY: การรวมแท็กมากกว่า IMAGE ID

เมื่อฉันพยายามที่จะลบภาพนักเทียบท่าที่มีคำสั่งที่docker rmi <IMAGE ID>ไม่มีภาชนะที่เกี่ยวข้องกับภาพนี้ฉันมีข้อความ:

$ docker rmi 3f66bec2c6bf
Error response from daemon: conflict: unable to delete 3f66bec2c6bf (cannot be forced) - image has dependent child images

ฉันสามารถลบได้สำเร็จเมื่อฉันใช้คำสั่ง docker rmi RPOSITORY:TAG

$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1

จริง คำอธิบายใด ๆ ว่าทำไมพฤติกรรมแปลก ๆ นี้?
RodrigoM

1
สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน ในกรณีของฉันฉันมีภาพ Ubuntu ที่ล้าสมัยมันไม่ได้อ้างถึงในภาพอื่น ๆ ในฐานะผู้ปกครอง แต่ก็ยังไม่สามารถลบได้ docker rmi 93fd78260bd1ล้มเหลว แต่docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:tempก็ประสบความสำเร็จ
โทมัส Lobker

ทำงานกับฉันก็ยังปรับปรุงภาพล้าสมัย ใครรู้ว่าทำไมมันล้มเหลว w id?
strider

3
นี่ไม่ได้เป็นการลบภาพจริงๆ มันเพิ่งลบแท็กที่ซ้ำกันสำหรับภาพนั้น (ดังนั้นข้อความUntagged: ubuntu:18.04v1) ถ้าคุณทำdocker images -aคุณอาจจะ3f66bec2c6bfยังคงอยู่ในรายการ หากภาพถูกลบอย่างแท้จริงคุณจะได้รับข้อความDeleted: 3f66bec2c6bf
wisbucky

17

คำสั่งนี้ลบภาพทั้งหมด (ใช้ด้วยความระมัดระวัง)

คุณเคยลองใช้ --force

sudo docker rmi $(sudo docker images -aq) --force

รหัสข้างต้นนี้ทำงานเหมือนมีเสน่ห์แม้ฉันเคยมีปัญหาเดียวกัน


1
ฉันออกจาก sudo ทั้งสองแห่งและใช้งานได้ดีสำหรับฉัน
user2217751

7

คำตอบที่นี่คือการหาเด็กทุกคนลงมาซึ่งมีคำตอบที่นี่:

นักเทียบท่าฉันจะดูรายการภาพเด็กที่ต้องพึ่งพาได้อย่างไร

จากนั้นใช้ภาพนั้นเพื่อลบภาพลูกตามลำดับ


9
คุณใส่เนื้อสคริปต์นี้ออกมาแล้วหรือยัง?
TT

1
ฉันไปข้างหน้าและทำให้เป็นเนื้อในสคริปต์ของฉันด้านล่าง
การชดเชย จำกัด

6

นี่คือสคริปต์ในการลบภาพและภาพทั้งหมดที่ขึ้นอยู่กับมัน

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo must supply image to remove;
    exit 1;
fi;

get_image_children ()
{
    ret=()
    for i in $(docker image ls -a --no-trunc -q); do
        #>&2 echo processing image "$i";
        #>&2 echo parent is $(docker image inspect --format '{{.Parent}}' "$i")
        if [[ "$(docker image inspect --format '{{.Parent}}' "$i")" == "$1" ]]; then
            ret+=("$i");
        fi;
    done;
    echo "${ret[@]}";
}

realid=$(docker image inspect --format '{{.Id}}' "$1")
if [[ -z "$realid" ]]; then
    echo "$1 is not a valid image.";
    exit 2;
fi;
images_to_remove=("$realid");
images_to_process=("$realid");
while [[ "${#images_to_process[@]}" -gt 0 ]]; do
    children_to_process=();
    for i in "${!images_to_process[@]}"; do
        children=$(get_image_children "${images_to_process[$i]}");
        if [[ ! -z "$children" ]]; then
            # allow word splitting on the children.
            children_to_process+=($children);
        fi;
    done;
    if [[ "${#children_to_process[@]}" -gt 0 ]]; then
        images_to_process=("${children_to_process[@]}");
        images_to_remove+=("${children_to_process[@]}");
    else
        #no images have any children. We're done creating the graph.
        break;
    fi;
done;
echo images_to_remove = "$(printf %s\n "${images_to_remove[@]}")";
indices=(${!images_to_remove[@]});
for ((i="${#indices[@]}" - 1; i >= 0; --i)) ; do
    image_to_remove="${images_to_remove[indices[i]]}"
    if [[ "${image_to_remove:0:7}" == "sha256:" ]]; then
        image_to_remove="${image_to_remove:7}";
    fi
    echo removing image "$image_to_remove";
    docker rmi "$image_to_remove";
done


4

สร้างโดยใช้วิธีเดรัจฉานแรงของ Simon Brady ที่นี่ถ้าคุณไม่มีภาพมากมายคุณสามารถใช้ฟังก์ชั่นเชลล์นี้ได้:

recursive_remove_image() {
  for image in $(docker images --quiet --filter "since=${1}")
  do
    if [ $(docker history --quiet ${image} | grep ${1}) ]
    then
      recursive_remove_image "${image}"
    fi
  done
  echo "Removing: ${1}"
  docker rmi -f ${1}
}

recursive_remove_image <image-id>แล้วโทรโดยใช้



3

เมื่อฉันต้องการลบภาพที่ไม่ได้ใช้บางส่วนที่มีชื่อ"<none>"ในนักเทียบท่าฉันเผชิญกับปัญหาunable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child imagesดังนั้นเพื่อแก้ปัญหานี้:

sudo docker ps -a

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                         PORTS                                              NAMES
01ee1276bbe0        lizard:1                    "/bin/sh -c 'java ..."   About an hour ago   Exited (1) About an hour ago                                                      objective_lewin
49d73d8fb023        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Up 19 hours                    0.0.0.0:8091->8091/tcp                             pedantic_bell
405fd452c788        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           infallible_varahamihira
532257a8b705        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           demo-default
9807158b3fd5        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           xenodochial_kilby
474930241afa        jenkins                     "/bin/tini -- /usr..."   13 days ago         Up 4 days                      0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   myjenkins
563d8c34682f        mysql/mysql-server:latest   "/entrypoint.sh my..."   3 weeks ago         Up 4 days (healthy)            0.0.0.0:3306->3306/tcp, 33060/tcp                  mymysql
b4ca73d45d20        phpmyadmin/phpmyadmin       "/run.sh phpmyadmin"     4 weeks ago         Exited (0) 3 weeks ago                                                            phpmyadmin

คุณจะเห็นว่าฉันมีหลายภาพที่มีชื่อ javaapp: ชื่อคอนเทนเนอร์ล่าสุดและแตกต่างกัน ดังนั้นฉันฆ่าและลบคอนเทนเนอร์ทั้งหมดของ "javaapp: ล่าสุด" คอนเทนเนอร์ด้วย:

sudo docker stop "containerName"

sudo docker rm "containrName"

แล้วก็

sudo docker rmi -f "imageId"

ดังนั้นฉันสามารถลบภาพทั้งหมดที่มีชื่อ "<none>"

โชคดี


1

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

นักเทียบท่า ps -a -f status = exited: คำสั่งนี้แสดงคอนเทนเนอร์ที่ออกทั้งหมดดังนั้นจากนั้นคัดลอกรหัสคอนเทนเนอร์จากนั้นเรียกใช้คำสั่งด้านล่างเพื่อลบคอนเทนเนอร์

นักเทียบท่า rm #containerId: คำสั่งนี้จะลบคอนเทนเนอร์ซึ่งอาจเป็นปัญหาที่กล่าวถึง "รูปภาพมีภาพลูกที่ขึ้นอยู่กับ"

จากนั้นลองลบภาพด้วยคำสั่งด้านล่าง

นักเทียบท่า rmi #ImageId


1

ฉันมีปัญหานี้และไม่มีคำตอบสั้น ๆ ที่นี่ใช้งานได้แม้ในหน้าที่กล่าวถึงโดย @tudor ด้านบน ฉันคิดว่าฉันจะแบ่งปันที่นี่วิธีกำจัดภาพ ฉันคิดว่าภาพที่ขึ้นต่อกันจะต้อง> = ขนาดของภาพหลักซึ่งช่วยระบุภาพเพื่อให้เราสามารถลบออกได้

ฉันแสดงรูปภาพตามขนาดเพื่อดูว่าฉันสามารถมองเห็นความสัมพันธ์ใด ๆ ได้หรือไม่:

docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t

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

จากนั้นฉันดูที่<none>คอนเทนเนอร์และจับคู่อันแรกในรายการที่มีขนาดใกล้เคียงกัน ฉันแสดงdocker rmi <image:tag>ภาพนั้นอย่างง่ายและภาพ<none>เด็กทั้งหมดไปกับมัน

ภาพที่มีปัญหากับภาพเด็กทั้งหมดเป็นจริงmyrepo/getstarted-lab ภาพที่ฉันใช้เมื่อฉันเริ่มเล่นกับนักเทียบท่าครั้งแรก เป็นเพราะฉันได้สร้างภาพใหม่จากภาพทดสอบครั้งแรกที่สร้างห่วงโซ่

หวังว่าจะช่วยคนอื่นในบางจุด


1

สมมติว่าเรามี Dockerfile

FROM ubuntu:trusty
CMD ping localhost

เราสร้างภาพจากที่ไม่มีแท็กหรือการตั้งชื่อ

docker build .

ตอนนี้เรามีรายงานความสำเร็จ "ประสบความสำเร็จในการสร้าง 57ca5ce94d04" หากเราเห็นภาพนักเทียบท่า

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              57ca5ce94d04        18 seconds ago      188MB
ubuntu              trusty              8789038981bc        11 days ago         188MB

เราจำเป็นต้องลบ docker rmi 57ca5ce94d04

ติดตามโดย

docker rmi 8789038981bc

โดยภาพนั้นจะถูกลบออก!

การบังคับให้ลบทั้งหมดตามที่บางคนแนะนำ

docker rmi $(docker images -q) -f

1

การขยายคำตอบที่ได้รับจาก @Nguyen - สามารถเพิ่มฟังก์ชั่นนี้ใน.bashrcetc ของคุณแล้วเรียกจาก commandline เพื่อช่วยล้างข้อมูลใด ๆimage has dependent child imagesข้อผิดพลาด ...

คุณสามารถเรียกใช้ฟังก์ชั่นด้วยตัวคุณเองและหากเกิดความdocker psล้มเหลวก็จะเรียกใช้dockerคำสั่งด้วยsudoและแจ้งให้คุณใส่รหัสผ่าน

ไม่ไม่ลบภาพสำหรับบรรจุทำงานใด ๆ !

docker_rmi_dependants ()                                                                                                                                                         
{ 
  DOCKER=docker
  [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"

  echo "Docker: ${DOCKER}"

  for n in $(${DOCKER} images | awk '$2 == "<none>" {print $3}');
  do  
    echo "ImageID: $n";
    ${DOCKER} inspect --format='{{.Id}} {{.Parent}}' $(${DOCKER} images --filter since=$n -q);
  done;

  ${DOCKER} rmi $(${DOCKER} images | awk '$2 == "<none>" {print $3}')
}

ฉันมีสิ่งนี้ใน.bashrcไฟล์ของฉันด้วย...

docker_rm_dangling ()  
{ 
  DOCKER=docker
  [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"

  echo "Docker: ${DOCKER}"

  ${DOCKER} images -f dangling=true 2>&1 > /dev/null && YES=$?;                                                                                                                  
  if [ $YES -eq 1 ]; then
    read -t 30 -p "Press ENTER to remove, or CTRL-C to quit.";
    ${DOCKER} rmi $(${DOCKER} images -f dangling=true -q);
  else
    echo "Nothing to do... all groovy!";
  fi  
}

ทำงานร่วมกับ:

$ docker --version 
Docker version 17.05.0-ce, build 89658be

0

บังคับให้ลบรายการรูปภาพ (ยกเว้นรุ่น 10 เช่น)

ภาพนักเทียบท่า รุ่น grep | grep -v version10> images.txt && สำหรับ img ใน $ (awk -F "" '{พิมพ์ $ 3}' /root/images.txt); ทำนักเทียบท่า rmi -f $ img; เสร็จแล้ว


-1

คุณสามารถทำสิ่งนี้:

➜ ~ sudo นักเทียบท่า RMI 4ed13257bb55 -f ลบ: SHA256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 ลบ: SHA256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 ลบ: SHA256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 ลบ: SHA256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded


-1

Image Layer: ที่เก็บมักจะเรียกว่ารูปภาพหรือภาพภาชนะ แต่จริงๆแล้วพวกเขาประกอบด้วยชั้นหนึ่งหรือมากกว่า เลเยอร์รูปภาพในที่เก็บเชื่อมต่อกันในความสัมพันธ์พาเรนต์ - ลูก แต่ละชั้นรูปภาพแสดงถึงการเปลี่ยนแปลงระหว่างตัวเองและชั้นผู้ปกครอง

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

หากคุณต้องการลบภาพทั้งหมดยกเว้นภาพล่าสุด (อัปเดตล่าสุด) และภาพแรก (ฐาน) เราสามารถส่งออกภาพสุดท้าย (อัปเดตล่าสุด) โดยใช้docker saveคำสั่งด้านล่าง

docker save -o <output_file> <your_image-id> | gzip <output_file>.tgz

จากนั้นให้ลบภาพทั้งหมดโดยใช้image-idดังภาพด้านล่าง

docker rm -f <image-id i> | docker rm -f <image i-1> | docker rm -f <image-id i-2> ... <docker rm -f <image-id i-k> # where i-k = 1

ตอนนี้โหลดภาพ tgz ที่คุณบันทึกไว้ด้านล่าง

gzip -c <output_file.tgz> | docker load

ดูรหัสภาพของภาพที่โหลดของคุณโดยใช้ docker ps -q ไม่มีแท็กและชื่อ คุณสามารถอัปเดตแท็กและชื่อตามด้านล่าง

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