依存する子イメージのあるDockerイメージを削除できません


162

やっています

docker rmi c565603bc87f

エラー:

デーモンからのエラー応答:競合:c565603bc87fを削除できません(強制できません)-画像に依存する子画像があります

そのため、-fフラグを使用しても画像を削除できません。画像とそのすべての子を削除するにはどうすればよいですか?

LinuxおよびDockerのバージョン:

uname -a Linux goracio-pc 4.4.0-24-generic#43-Ubuntu SMP Wed Jun 8 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

dockerバージョンクライアント:バージョン:1.11.2 APIバージョン: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 Goバージョン:go1.5.4 Git commit:b9f10c9ビルド:Wed Jun 1 22:00:43 2016 OS / Arch:linux / amd64


多分これは助けることができます:gist.github.com/Siva-Charan/db7bd84ad2ca2b0779d87a75e6bb4176
Gujarat Santana

2
最新のものから古いものへタグで削除します。リポジトリに住んでいる場合、Dockerfileで必要な場合はプルされます。
rafaelbattesti

Nguyenが提供した(非常に良い)回答を受け入れる必要があります
jpw

回答:


119

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

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

その後、次を実行:

docker rmi c565603bc87f

12
>なし-任意のダングリング画像...ドッカ画像-fダングリング=真一切ありません
ローマ

38
この回答は、「ぶら下がり画像を削除するにはどうすればよいですか?」という別の質問に答えています。OPの質問は、「依存イメージを削除するにはどうすればよいですか?」です。
tu-Reinstate Monica-dor duh 2016

6
ぶら下がり画像を削除するには、次を使用しますprune
Deqing

17
コマンドは、もはや機能しないこと:> "docker rmi" requires at least 1 argument.
samayo

2
@samayoそのエラーが発生した場合は、フィルター部分を次のように変更してみてください--filter=dangling=true。それでもエラーが発生する場合は、ダングリングイメージがないことを意味しているため、in-setコマンドは空の文字列に評価されます。
HammerN'Songs

99

(私の場合のように)場合によっては、存在しないことに気付いていないタグが複数ある画像IDを指定して画像を削除しようとしていることがあります。その一部は他の画像で使用されている可能性があります。その場合、画像を削除したくない場合があります

ここで説明するように冗長タグのケースがある場合は、削除する冗長タグでdocker rmi <image_id>使用するのdocker rmi <repo:tag>ではなく。


11
docker rmi <repo:tag>あなたの解決策はそれらの答えの中で非常に簡単です、ありがとう
Shihe Zhang

これはcorretリモート古いgolang画像に私の場合のためにそうするための方法であるべきである
寺院

これは私にとってチケットでした、ありがとう。Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

誰かがMicrosoftのeShopOnContainersサンプルをインストールした場合、repo:tag2つのイメージIDのみを共有する8つのタグ付きイメージが作成されるため、この方法でそれぞれを絶対に削除する必要があります。Visual Studioでもコンテナー管理ウィンドウでそれらを削除しません...
mdisibio

このコマンドdocker rmi <repo:tag>タグを解除するだけで、必ずしも画像を削除するわけではありません。この画像を参照しているタグが複数ある場合、またはOPによって示されているような別の問題がある場合でも、画像はそのまま残ります。コマンドを使用して、イメージがまだ存在することを確認できdocker images ls --allます。
twan163

49

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

docker rmi $(docker images -q) -f

ここに画像の説明を入力してください


1
これでうまくいきました。私は自分のローカル画像をすべて吹き飛ばしたいと思っていました。:注、私は私のドッキングウィンドウのバージョン(18.09.7)で動作するように更新しなければならなかった docker image rm $(docker image ls -a -q) -f
akagixxer

40

問題の画像の後に作成されたすべての画像の画像IDと親IDを次のように検索します。

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

次に、コマンドを呼び出します。

docker rmi {sub_image_id} 

「sub_image_id」は依存イメージのIDです


特定の画像の中間画像を削除するのに最適です。ありがとう!!
A.Villegas

不明なフラグ--filter:/
SamuraiJack

これは質問に対する実際の解決策のようです!
パオロ

28

私にとってうまくいったのは、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

確かに。この奇妙な振る舞いの理由は何ですか?
RodrigoM

1
これも私にとってはうまくいきました。私の場合、古くなったUbuntuイメージがあり、他のイメージで親として参照されていませんでしたが、それでも削除できませんでした。docker rmi 93fd78260bd1失敗しましたが、その後docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:temp成功しました。
Thomas Lobker

私にとっては、古くなった画像も更新していました。誰もがなぜそれが失敗するのか知っていますか?
ストライダー

3
これは実際には画像を削除しません。その画像の重複するタグを削除するだけです(したがってメッセージUntagged: ubuntu:18.04v1)。実行するとdocker images -a、おそらく3f66bec2c6bfまだリストに表示されます。画像が本当に削除された場合、次のメッセージが表示されますDeleted: 3f66bec2c6bf
wisbucky

17

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

--forceを使用しようとしましたか

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

この上のコードは、私も同じ問題を抱えていました


1
私は両方の場所でsudoをやめました、そしてそれは私のために
うまくいき


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

6
# docker rm $(docker ps -aq)

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


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>


4
docker rmi <rep:tag>

例:

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

docker rmi python:3.6


3

docker で名前の付い"<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:latestという名前でコンテナ名が異なる複数の画像があることがわかります。だから、私は「javaapp:latest」コンテナのすべてのコンテナを殺して削除しました:

sudo docker stop "containerName"

sudo docker rm "containrName"

その後

sudo docker rmi -f "imageId"

名前の付いたすべての画像を削除できます "<none>"

幸運を


1

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

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

docker rm #containerId:このコマンドはコンテナーを削除します。これは、「イメージに依存する子イメージがある」という言及の問題である可能性があります

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

docker rmi #ImageId


1

私にはこの問題があり、上記の@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

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

@Nguyenによって提供された答えを拡張-この関数を.bashrcetcに追加して、コマンドラインから呼び出して、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 && for img in $(awk -F "" '{print $ 3}' /root/images.txt); docker rmi -f $ imgを実行します。できた


-1

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

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


-1

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

Docker構築パターンは継承を使用します。これは、バージョンがバージョンiによって異なることを意味しi-1ます。したがって、version 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を使用して、ロードしたイメージのイメージIDを確認します。タグと名前はありません。以下のようにタグと名前を更新するだけです。

docker tag <image_id> group_name/name:tag
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.