我在努力

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


当前回答

当我想删除一些未使用的图像名称“<none>”在docker中,我面临的问题是无法删除a354bbc7c9b7(不能强制)-图像有依赖的子图像。为了解决这个问题:

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“containrName”

Then

sudo docker rmi -f "imageId"

所以我可以删除所有的图像名称“<none>”

古德勒克

其他回答

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

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

前面所有的答案都是正确的,但这里有一个解决方案,就是强行删除所有的图像(使用这个命令,风险自负,它将删除所有的图像)

docker rmi $(docker images -q) -f

在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>调用它。

扩展@Nguyen提供的答案-这个函数可以添加到你的.bashrc等,然后从命令行调用,以帮助清理任何有依赖子图像的图像错误…

您可以自己运行该函数,如果docker ps失败,那么它将使用sudo运行docker命令并提示您输入密码。

不会删除任何正在运行的容器的映像!

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

我也有这个问题,我可以解决以下命令的问题。这可能是由于,图像的容器正在运行或退出,所以在删除图像之前,您需要删除容器

docker ps -a -f status=exited:该命令显示所有退出的容器,因此复制container Id,然后运行以下命令删除container

这个命令删除容器,这可能是提到“镜像有依赖的子图像”的问题。

然后尝试用下面的命令删除图像

码头工人 RMI #ImageId