web-dev-qa-db-ja.com

依存する子画像を含むdocker画像を削除できない

やっています

docker rmi c565603bc87f

エラー:

デーモンからのエラー応答:コンフリクト:c565603bc87fを削除できません(強制できません) - 画像に従属する子画像があります

だから-fフラグを付けても削除できない。当時とそのすべての子を削除するにはどうすればいいですか?

Linuxおよびdockerのバージョン

uname -a Linux goracio-pc 4.4.0-24-generic#43-Ubuntu SMP水6月8日19時27分37秒UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

docker versionクライアント:version:1.11.2 API version:1.23 Goバージョン:go1.5.4 Git commit:b9f10c9ビルド:Wed Jun 1 22:00:43 2016 OS/Arch:linux/AMD64

サーバー:バージョン:1.11.2 APIバージョン:1.23移動バージョン:go1.5.4 Git commit:b9f10c9ビルド:Wed Jun 1 22:00:43 2016 OS/Arch:linux/AMD64

83
Roman

画像を削除する前に、不要な画像を削除してください。

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

その後:

docker rmi c565603bc87f
62

ある場合には(私の場合のように)あなたは画像を削除しようとしているかもしれません複数のタグを持つ画像IDを指定することであなたが存在しないことを知ります。 。その場合、あなたは画像を削除したくないかもしれません

docker rmi <image_id>の代わりにここで説明されているような冗長なタグがある場合は、削除したい冗長なタグにdocker rmi <repo:tag>を使用してください。

29
bbarker

問題のイメージの後に作成されたすべてのイメージのイメージIDと親IDを見つけます。

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

次にcommandを呼び出します。

docker rmi {sub_image_id} 

"sub_image_id"は依存画像のIDです

22
Nguyen Vu Quang

これまでの答えはすべて正解ですが、すべての画像を強制的に削除する1つの解決策があります(自分の責任でこのコマンドを使用すると、すべての画像が削除されます

docker rmi $(docker images -q) -f

enter image description here

15
grepit

私にとって効果的だったのは、IMAGE IDではなくREPOSITORY:TAGの組み合わせを使用することでした。

このイメージに関連付けられたコンテナーを指定せずにコマンドdocker rmi <IMAGE ID>を使用してdockerイメージを削除しようとしたときに、次のメッセージが表示されました。

$ 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
14
Eduardo Costa

このコマンドはすべての画像を削除します(注意して使用してください)

--forceを使おうとしましたか

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

上のコードは魅力的でも同じ問題を抱えています。

10
Dapter20

これは、ある画像とそれに依存するすべての画像を削除するスクリプトです。

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

ここに答えはここに答えがあるすべての子孫の子供を見つけることです。

docker依存している子画像のリストを取得するにはどうすればいいですか?

それを使って順番に子画像を削除します。

5
tudor

Simon Bradyの総当たり法 ここ を基にして、大量の画像がない場合は、このShell関数を使用できます。

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>を使ってそれを呼び出します。

4
slushy

私はdockerで名前"<none>"を持ついくつかの未使用の画像を削除したいとき私はこの問題を解決するための問題unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images.Soに直面しています。

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:latest"コンテナーのすべてのコンテナーを削除します。

Sudo docker stop "containerName"

Sudo docker rm "containsrName"

それから

Sudo docker rmi -f "imageId"

だから私は"<none>"という名前のすべての画像を削除することができます

がんばろう

3
Saman Salehi
# docker rm $(docker ps -aq)

その後、Nguyenが提案したようにコマンドを使用します。

2
camino

私はこの問題を抱えていました、そして上の@tudorによって言及されたページでさえ、ここでの短い答えのどれもうまくいきませんでした。私はここで私がイメージを取り除く方法を共有すると思いました。従属イメージは親イメージのサイズ以上でなければならないというアイデアを思いつきました。

相関関係を見つけることができるかどうかを確認するために、サイズ順に画像をリストしました。

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

これがすることは、最初に画像サイズの列を配置するためにdockerからの特別なフォーマットを使用し、それから人間が読める形式のソートを逆の順序で実行することです。それから読みやすい列を復元します。

それから私は<none>コンテナを見て、リストの最初のコンテナを同じサイズで一致させました。私はその画像に簡単なdocker rmi <image:tag>を実行しました、そしてすべての<none>子画像はそれと一緒に行きました。

私が最初にdockerで遊び始めたとき、すべての子の画像の問題の画像は実際にはいまいましいmyrepo/getstarted-lab私が使った画像 でした。チェーンを作成した最初のテストイメージから新しいイメージを作成したためです。

うまくいけば、それはある時点で他の誰かに役立ちます。

1
Chris Gillatt

私もこの問題を抱えていました、私は以下のコマンドで問題を解決することができました。これが原因である可能性があります。画像のコンテナが実行中または終了しているため、画像を削除する前にコンテナを削除する必要があります。

docker ps -a -f status = exited:このコマンドは終了したコンテナをすべて表示するので、コンテナIDをコピーしてから以下のコマンドを実行してコンテナを削除します。

docker rm #containerId:このコマンドはコンテナを削除しますこれは「画像に従属する子画像がある」という言及が問題になるかもしれません

次に、下記のコマンドで画像を削除してみてください

docker rmi #ImageId

1
Damith Asanka

Dockerfileがあるとします。

FROM ubuntu:trusty
CMD ping localhost

タグやネーミングなしでそこから画像を構築

docker build .

これで、成功レポート「Successfully built 57ca5ce94d04」が表示されます。dockerの画像を見ると

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
vimal krishna

Image Layer:リポジトリは、しばしばイメージまたはコンテナイメージと呼ばれますが、実際には1つ以上のレイヤーで構成されています。リポジトリ内の画像レイヤーは、親子関係で互いに接続されています。各画像レイヤーは、それ自体と親レイヤーの間の変更を表します。

Docker buildingパターンは継承を使います。これは、バージョンiがバージョンi-1に依存していることを意味します。そのため、バージョンiを削除できるようにするには、バージョンi+1を削除する必要があります。これは単純な依存関係です。

最後の画像(最も更新されたもの)と最初の画像(基本)以外のすべての画像を削除したい場合は、以下のように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を使用して、ロードしたイメージのイメージIDを確認してください。タグと名前はありません。下記のように単にタグと名前を更新することができます。

docker tag <image_id> group_name/name:tag
0
Uddhav Gautam

あなたはこれをすることができます:

➜〜須藤ドッキングウィンドウRMI 4ed13257bb55 -f削除:SHA256:4ed13257bb5512b975b316ef482592482ca54018a7728​​ea1fc387e873a68c358削除:SHA256:4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3削除された:SHA256:96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69削除:SHA256:d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded

0
0xsr3k4nth

画像のリストを強制的に削除します(たとえば、バージョン10を除く)

港湾労働者画像| grepバージョンgrep -v version10> images.txt && in $(awk -F "" '{print $ 3}' /root/images.txt) docker rmi -f $ img;を実行します。終わった

0
Nekhla karim

@ Nguyenによって提供された答えを拡張して - この関数はあなたの.bashrcなどに追加され、それからどんなエラーも片付けるのを助けるためにコマンドラインから呼ばれることができますimage has dependent child imagesエラー...

あなたは自分自身で関数を実行することができます、そして、docker psが失敗するならば、それはdockerSudoコマンドを実行して、あなたにあなたのパスワードを促します。

NOT実行中のコンテナの画像を削除します。

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
Android Control