我在努力

docker rmi c565603bc87f

错误:

来自守护进程的错误响应:冲突:无法删除c565603bc87f (不能强制)- image有依赖的子映像

所以我不能用-f标记删除image。如何删除图像,然后所有的孩子?

Linux和docker版本:

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

码头工人版本 客户: 版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git提交:b9f10c9 建成:2016年6月1日星期三22:00:43 OS /拱:linux / amd64

服务器: 版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git提交:b9f10c9 建成:2016年6月1日星期三22:00:43 OS /拱:linux / amd64


当前回答

图像层:存储库通常被称为图像或容器图像,但实际上它们由一个或多个层组成。存储库中的映像层以父子关系连接在一起。每个图像层表示自己和父层之间的变化。

docker构建模式使用继承。这意味着版本i依赖于版本i-1。因此,我们必须删除版本i+1才能删除版本i。这是一个简单的依赖关系。

如果你想删除所有图像,除了最后一个(最新的)和第一个(基础),然后我们可以导出最后一个(最新的一个)使用docker保存命令如下所示。

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查看加载图像的image-id。它没有标签和名字。您可以简单地更新标签和名称,如下所示。

docker tag <image_id> group_name/name:tag

其他回答

# docker rm $(docker ps -aq)

之后,按照阮的建议使用命令。

我有这个问题,这里没有一个简短的答案,即使在上面@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/getstart -lab映像。这是因为我从第一个创建链的测试图像中创建了一个新图像。

希望这能在某种程度上帮助到其他人。

正如这里所解释的,我使用以下方法来识别依赖图像并删除它们,

image_id=123456789012

docker images -a -q --filter since=$image_id |
xargs docker inspect --format='{{.Id}} {{.Parent}}'

你会看到类似这样的输出:

sha256:f7ef19862215ec0bf7a6b103504d213e1c001691703808f4154689cfbb5f14f9 sha256:a7d2efad2847bd10e5223980ed80f5781c716eddbf6131a3cf97614e7f2db97f
sha256:03690ae141346203959d0ae1b3e8d34b7a4232095d774af57dda6282fce99cc4 sha256:5713074659bb5352496ea680a903eba2f66e0495538c9db37336f4ba92994ea8
sha256:311f587811942d328edc52e5953d794eb9b81fe392512080d9fc1d350a6b2024 sha256:aa674f7f2621946db257720c378377b8714739d20879542d875b84c53b59bc75

然后你可以逐个删除这些图片,如下所示:

docker image rm f7ef19862215ec0bf7a6b103504d213e1c001691703808f4154689cfbb5f14f9

输出类似如下所示的内容:

Untagged: prathap/cognitive_robotics_gpu:v1
Untagged: prathap/cognitive_robotics_gpu@sha256:db6e7543a13e9a96241c985b9b3145b8fd65effb68c183301385b495875f1a5a
Deleted: sha256:03690ae141346203959d0ae1b3e8d34b7a4232095d774af57dda6282fce99cc4
Deleted: sha256:263f655670436758f8e3f23f31170083fc8d60c4eebe01a5b3fda1e73bed3ad1

你可以这样做:

➜~出汗决议rmi 4ed13257bb55 + Deleted: sha256:4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 Deleted: sha256:4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 Deleted: sha256:96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 Deleted: sha256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded

下面是一个脚本,用于删除一个图像和依赖于它的所有图像。

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