Không thể xóa hình ảnh docker với hình ảnh con phụ thuộc


162

tôi đang cố gắng

docker rmi c565603bc87f

Lỗi:

Lỗi phản hồi từ daemon: Xung đột: không thể xóa c565603bc87f (không thể bắt buộc) - hình ảnh có hình ảnh con phụ thuộc

Vì vậy, tôi không thể xóa hình ảnh ngay cả với cờ -f. Làm thế nào để xóa hình ảnh sau đó và tất cả các con của nó?

Phiên bản Linux và docker:

uname -a Linux goracio-pc 4.4.0-24-generic # 43-Ubuntu SMP Thứ tư ngày 8 tháng 6 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

phiên bản docker Máy khách: Phiên bản: 1.11.2 Phiên bản API: 1.23 Phiên bản đi: go1.5.4 Cam kết Git: b9f10c9 Được xây dựng: Thứ tư ngày 1 tháng 6 22:00:43 2016 Hệ điều hành / Arch: linux / amd64

Máy chủ: Phiên bản: 1.11.2 Phiên bản API: 1.23 Phiên bản đi: go1.5.4 Cam kết Git: b9f10c9 Được xây dựng: Thứ tư ngày 1 tháng 6 22:00:43 2016 Hệ điều hành / Arch: linux / amd64



2
Xóa theo thẻ từ mới nhất đến cũ nhất. Nếu họ sống trong một repo, họ sẽ bị kéo nếu có Dockerfile yêu cầu họ.
rafaelbattesti

bạn nên chấp nhận câu trả lời (rất tốt) mà Nguyễn cung cấp
jpw

Câu trả lời:


119

Bạn nên cố gắng xóa những hình ảnh không cần thiết trước khi xóa hình ảnh:

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

Sau đó, chạy:

docker rmi c565603bc87f

12
Không có bất kỳ hình ảnh lơ lửng nào ... hình ảnh docker -f dangling = true -> nothing
Roman

38
Câu trả lời này đang trả lời một câu hỏi khác "Làm cách nào để xóa hình ảnh lơ lửng?" Câu hỏi của OP là "Làm cách nào để xóa hình ảnh phụ thuộc?"
tu-Tái lập Monica-dor duh

6
Để xóa hình ảnh lơ lửng, chỉ cần sử dụngprune
De Khánh

17
lệnh đó không còn hoạt động:> "docker rmi" requires at least 1 argument.
samayo

2
@samayo nếu bạn gặp lỗi đó, hãy thử thay đổi phần bộ lọc thành : --filter=dangling=true. Nếu bạn vẫn gặp phải lỗi đó, điều đó chỉ có nghĩa là bạn không có bất kỳ hình ảnh lơ lửng nào và do đó, lệnh in-set sẽ đánh giá một chuỗi trống.
HammerN'Songs

99

Trong một số trường hợp (như trong trường hợp của tôi), bạn có thể đang cố xóa một hình ảnh bằng cách chỉ định id hình ảnh có nhiều thẻ mà bạn không nhận ra tồn tại, một số trong đó có thể được sử dụng bởi các hình ảnh khác. Trong trường hợp đó, bạn có thể không muốn xóa hình ảnh .

Nếu bạn gặp trường hợp thẻ thừa như được mô tả ở đây, thay vì docker rmi <image_id>sử dụng docker rmi <repo:tag>trên thẻ dự phòng bạn muốn xóa.


11
docker rmi <repo:tag>làm việc cho tôi. Giải pháp của bạn khá đơn giản trong số những câu trả lời, cảm ơn bạn.
Shihe Zhang

đây là cách tốt nhất để làm như vậy đối với trường hợp của tôi đối với những hình ảnh golang cũ từ xa
ngôi đền

Đây là vé cho tôi, cảm ơn. Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

Nếu bất cứ ai đã cài đặt các mẫu eShopOnContainers của Microsoft, bạn hoàn toàn phải xóa từng cái theo cách này bởi repo:tagvì nó tạo ra tám hình ảnh được gắn thẻ chỉ chia sẻ hai id hình ảnh. Ngay cả Visual Studio cũng sẽ không xóa chúng trong cửa sổ quản lý vùng chứa của nó ...
mdisibio

Lệnh docker rmi <repo:tag>chỉ gỡ bỏ , nó không nhất thiết phải xóa một hình ảnh. Nếu có nhiều hơn một thẻ tham chiếu hình ảnh này hoặc nếu có một vấn đề khác như ví dụ như OP đã nêu, hình ảnh sẽ vẫn ở đó. Bạn có thể kiểm tra hình ảnh đó vẫn tồn tại với lệnh docker images ls --all.
twan163

49

tất cả các câu trả lời trước đây đều đúng nhưng đây là một giải pháp chỉ cần xóa tất cả các hình ảnh của bạn một cách mạnh mẽ ( sử dụng lệnh này có nguy cơ sẽ tự xóa tất cả các hình ảnh của bạn )

docker rmi $(docker images -q) -f

nhập mô tả hình ảnh ở đây


1
Điều này làm việc cho tôi; Tôi chỉ muốn thổi bay tất cả những hình ảnh địa phương của tôi. Lưu ý, tôi đã phải cập nhật để hoạt động với phiên bản docker của mình (18.09.7): docker image rm $(docker image ls -a -q) -f
akagixxer

40

tìm id hình ảnh và id cha cho tất cả hình ảnh được tạo sau hình ảnh được đề cập với nội dung sau:

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

Sau đó, bạn gọi lệnh:

docker rmi {sub_image_id} 

"sub_image_id" là ID của hình ảnh phụ thuộc


Rất tốt để xóa hình ảnh trung gian của một hình ảnh cụ thể. Cảm ơn!!
A.Villegas

cờ không xác định - bộ lọc: /
SamuraiJack

Đây dường như là giải pháp thực tế cho câu hỏi!
Paolo

28

Điều làm việc với tôi là sử dụng kết hợp REPOSITORY: TAG thay vì IMAGE ID.

Khi tôi cố xóa một hình ảnh docker bằng lệnh docker rmi <IMAGE ID>không có thùng chứa liên quan đến hình ảnh này, tôi đã có thông báo:

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

Tôi có thể xóa thành công khi tôi sử dụng lệnh docker rmi RPOSITORY:TAG

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

Thật. Bất kỳ lời giải thích tại sao hành vi kỳ lạ này?
RodrigoM

1
Cái này cũng có tác dụng với tôi. Trong trường hợp của tôi, tôi đã có một hình ảnh Ubuntu đã lỗi thời, nó không được tham chiếu trong bất kỳ hình ảnh nào khác với tư cách là cha mẹ, nhưng nó vẫn không thể xóa. docker rmi 93fd78260bd1thất bại, nhưng sau đó docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:tempđã thành công.
Thomas lobker

làm việc cho tôi, cũng đang cập nhật một hình ảnh lỗi thời. Bất cứ ai biết tại sao nó thất bại w id?
strider

3
Điều này không thực sự xóa hình ảnh. Nó chỉ xóa một thẻ trùng lặp cho hình ảnh đó (do đó là tin nhắn Untagged: ubuntu:18.04v1). Nếu bạn làm như vậy docker images -a, bạn có thể sẽ thấy 3f66bec2c6bfvẫn được liệt kê. Nếu hình ảnh thực sự bị xóa, bạn sẽ nhận được thông báoDeleted: 3f66bec2c6bf
wvducky

17

ĐIỀU NÀY KHÁM PHÁ TẤT CẢ CÁC HÌNH ẢNH (SỬ DỤNG VỚI CẨN TRỌNG)

Bạn đã thử sử dụng - lực lượng

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

Đoạn mã trên chạy như bùa mê ngay cả tôi cũng gặp vấn đề tương tự


1
Tôi đã bỏ sudo ở cả hai nơi và nó hoạt động rất tốt với tôi
user2217751


6

Đây là một kịch bản để loại bỏ một hình ảnh và tất cả các hình ảnh phụ thuộc vào nó.

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

6
# docker rm $(docker ps -aq)

Sau đó dùng lệnh như Nguyễn gợi ý.


4

Xây dựng theo phương pháp vũ phu của Simon Brady tại đây , nếu bạn không có nhiều hình ảnh, bạn có thể sử dụng chức năng vỏ này:

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}
}

và sau đó gọi nó bằng cách sử dụng recursive_remove_image <image-id>.


4
docker rmi <rep:tag>

Ví dụ:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.6            60f85556d5d2        4 days ago          174MB

docker rmi python: 3.6


3

Khi tôi muốn xóa một số hình ảnh không sử dụng có tên "<none>"trong docker tôi phải đối mặt với vấn đề unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images. Vì vậy, để giải quyết vấn đề này:

bến tàu sudo 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

bạn có thể thấy rằng tôi có một số Hình ảnh với tên javaapp: tên container mới nhất và khác nhau. Vì vậy, tôi đã giết và xóa tất cả vùng chứa của "javaapp: mới nhất" với:

sudo docker dừng "containerName"

sudo docker rm "chứarName"

Sau đó

sudo docker rmi -f "imageId"

Vì vậy, tôi có thể loại bỏ tất cả các hình ảnh với tên "<none>"

chúc may mắn


1

Tôi cũng gặp vấn đề này, tôi có thể giải quyết vấn đề với các lệnh bên dưới. điều này có thể là do, vùng chứa hình ảnh đang chạy hoặc thoát vì vậy trước khi xóa hình ảnh, bạn cần xóa vùng chứa

docker ps -a -f status = exited: lệnh này hiển thị tất cả các container đã thoát để sao chép Id của container và sau đó chạy bên dưới các lệnh để loại bỏ container

docker rm #containerId: lệnh này loại bỏ container, đây có thể là vấn đề đề cập đến "hình ảnh có hình ảnh con phụ thuộc"

Sau đó thử xóa hình ảnh bằng lệnh bên dưới

docker rmi #ImageId


1

Tôi đã có vấn đề này và không có câu trả lời ngắn nào ở đây có hiệu quả, ngay cả trong trang được đề cập bởi @tudor ở trên. Tôi nghĩ rằng tôi sẽ chia sẻ ở đây làm thế nào tôi thoát khỏi những hình ảnh. Tôi đã nảy ra ý tưởng rằng hình ảnh phụ thuộc phải> = kích thước của hình ảnh gốc, giúp xác định nó để chúng tôi có thể loại bỏ nó.

Tôi liệt kê các hình ảnh theo kích thước để xem liệu tôi có thể phát hiện ra bất kỳ mối tương quan nào không:

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

Những gì nó làm, là sử dụng một số định dạng đặc biệt từ docker để định vị cột kích thước hình ảnh trước, sau đó chạy một loại con người có thể đọc theo thứ tự ngược lại. Sau đó, tôi khôi phục các cột dễ đọc.

Sau đó, tôi nhìn vào các <none>thùng chứa, và khớp cái đầu tiên trong danh sách với kích thước tương tự. Tôi đã thực hiện một đơn giản docker rmi <image:tag>trên hình ảnh đó và tất cả<none> hình ảnh trẻ em đã đi với nó.

Hình ảnh có vấn đề với tất cả các hình ảnh trẻ em thực sự là hình ảnh chết tiệt myrepo/getstarted-lab mà tôi đã sử dụng khi lần đầu tiên bắt đầu chơi với docker. Đó là bởi vì tôi đã tạo ra một hình ảnh mới từ hình ảnh thử nghiệm đầu tiên tạo ra chuỗi.

Hy vọng rằng sẽ giúp người khác tại một số điểm.


1

Giả sử chúng ta có Dockerfile

FROM ubuntu:trusty
CMD ping localhost

Chúng tôi xây dựng hình ảnh từ đó mà không cần đặt tên hoặc đặt tên

docker build .

Bây giờ chúng tôi có một báo cáo thành công "Xây dựng thành công 57ca5ce94d04" Nếu chúng ta thấy các hình ảnh docker

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

Trước tiên chúng ta cần loại bỏ docker rmi 57ca5ce94d04

Theo dõi bởi

docker rmi 8789038981bc

Bởi hình ảnh đó sẽ bị xóa!

Loại bỏ tất cả theo đề nghị của ai đó

docker rmi $(docker images -q) -f

1

Mở rộng dựa trên câu trả lời được cung cấp bởi @Nguyen - chức năng này có thể được thêm vào .bashrcvv của bạn và sau đó được gọi từ dòng lệnh để giúp dọn dẹp bất kỳimage has dependent child images lỗi ...

Bạn có thể tự chạy chức năng và nếu docker psthất bại, nó sẽ chạy dockerlệnh sudovà nhắc bạn nhập mật khẩu.

Liệu KHÔNG xóa hình ảnh cho bất kỳ container chạy!

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}')
}

Tôi cũng có cái này trong .bashrctập tin của mình ...

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  
}

Hoạt động với:

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

0

Buộc xóa danh sách hình ảnh (ví dụ: loại trừ phiên bản 10)

hình ảnh docker | phiên bản grep | grep -v phiên bản10> hình ảnh.txt && cho img bằng $ (awk -F "" '{in $ 3}' /root/images.txt); làm docker rmi -f $ img; làm xong


-1

bạn có thể làm điều này:

➜ ~ sudo Docker rmi 4ed13257bb55 -f Deleted: sha256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 Deleted: sha256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 Deleted: sha256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 Deleted: sha256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded


-1

Lớp hình ảnh: Kho lưu trữ thường được gọi là hình ảnh hoặc hình ảnh chứa, nhưng thực sự chúng được tạo thành từ một hoặc nhiều lớp. Các lớp hình ảnh trong một kho lưu trữ được kết nối với nhau trong mối quan hệ cha-con. Mỗi lớp hình ảnh đại diện cho những thay đổi giữa chính nó và lớp cha.

Các mô hình xây dựng docker sử dụng thừa kế . Nó có nghĩa là phiên bản iphụ thuộc vào phiên bản i-1. Vì vậy, chúng ta phải xóa phiên bản i+1để có thể xóa phiên bản i. Đây là một phụ thuộc đơn giản.

Nếu bạn muốn xóa tất cả các hình ảnh ngoại trừ hình ảnh cuối cùng (cập nhật nhất) và đầu tiên (cơ sở) thì chúng ta có thể xuất hình ảnh cuối cùng (hình ảnh cập nhật nhất) bằng cách sử dụng docker savelệnh như dưới đây.

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

Sau đó, bây giờ, xóa tất cả các hình ảnh bằng cách sử dụng id hình ảnh như dưới đây.

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

Bây giờ, tải hình ảnh tgz đã lưu của bạn như dưới đây.

gzip -c <output_file.tgz> | docker load

xem id hình ảnh của hình ảnh được tải của bạn bằng docker ps -q. Nó không có thẻ và tên. Bạn chỉ có thể cập nhật thẻ và tên như được thực hiện dưới đây.

docker tag <image_id> group_name/name:tag
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.