在Docker – OSX中删除旧图像

我一直在玩Tensorflow的docker图像。

总结一下,我首先安装了标准镜像,然后意识到我需要nodejs,所以添加了它,并做了docker commit。 然后意识到我需要expressJS,并添加了一个提交

我正在运行docker v1.12.5(所以新的gc / prune命令不在那里)

在这个阶段, docker images -a显示:

 REPOSITORY TAG IMAGE ID CREATED SIZE tensor-node-express latest f2f59eb61aae 15 hours ago 2.104 GB gcr.io/tensorflow/tensorflow latest-devel 308238445d5c 2 days ago 1.995 GB gcr.io/tensorflow/tensorflow <none> 74435614a991 9 days ago 1.52 GB 

我只想保留tensor-node-express并删除旧的图像。

 $ docker rmi 308238445d5c Error response from daemon: conflict: unable to delete 308238445d5c (cannot be forced) - image has dependent child images $docker rmi gcr.io/tensorflow/tensorflow:latest-devel Error response from daemon: conflict: unable to remove repository reference "gcr.io/tensorflow/tensorflow:latest-devel" (must force) - container 03de9d864e31 is using its referenced image 308238445d5c 

我认为这意味着docker提交商店差异化图像,但是当我去~/.docker/machine/machines/default ,我看到:

 40894464 Mar 13 13:57 boot2docker.iso 5043847168 Mar 16 08:34 disk.vmdk 

我想5G文件是我的图像,这似乎显示每个docker提交是完整的形象的组合!

任何想法,我只能使用最新的docker图像( tensor-node-express ),并释放我的高清入侵docker?

补充信息 – 这是docker ps -a的输出

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e6dcd2915991 tensor-node-express "/bin/bash" 15 hours ago Exited (130) 15 hours ago flamboyant_bose fb44b19a21c2 gcr.io/tensorflow/tensorflow:latest-devel "/bin/bash" 18 hours ago Exited (130) 15 hours ago compassionate_bose 075001a687e3 gcr.io/tensorflow/tensorflow:latest-devel "/bin/bash" 18 hours ago Exited (0) 18 hours ago nervous_sinoussi a80ce2d2e688 gcr.io/tensorflow/tensorflow:latest-devel "/bin/bash" 19 hours ago Exited (130) 18 hours ago happy_euclid f493bd3c8712 gcr.io/tensorflow/tensorflow:latest-devel "/bin/bash" 19 hours ago Exited (1) 19 hours ago friendly_cori 03de9d864e31 gcr.io/tensorflow/tensorflow:latest-devel "/bin/bash" 2 days ago Exited (255) 23 minutes ago 6006/tcp, 8888/tcp tender_hopper 2dd1e83d62d3 gcr.io/tensorflow/tensorflow:latest-devel "/bin/bash" 2 days ago Exited (0) 15 hours ago modest_einstein 3067ed171b1c gcr.io/tensorflow/tensorflow:latest-devel "/bin/bash" 2 days ago Exited (0) 2 days ago dazzling_bhabha 62c699afd3fd 74435614a991 "/bin/bash" 2 days ago Exited (127) 2 days ago inspiring_austin 9523ffe2945c 74435614a991 "/bin/bash" 2 days ago Exited (0) 2 days ago kickass_leakey e06958ea517c 74435614a991 "/bin/bash" 2 days ago Exited (0) 2 days ago objective_euler ccf922954667 74435614a991 "/bin/bash" 2 days ago Exited (255) 2 days ago dreamy_bartik fad0d92a07a3 74435614a991 "/bin/bash" 2 days ago Exited (130) 2 days ago elastic_dubinsky f2a98d4e11ea 74435614a991 "/bin/bash" 2 days ago Exited (0) 2 days ago heuristic_kilby f07e46367b17 74435614a991 "/bin/bash" 2 days ago Exited (130) 2 days ago trusting_darwin 5bbf9cf992b8 74435614a991 "/bin/bash" 2 days ago Exited (0) 2 days ago flamboyant_knuth 

我尝试docker ps --filter "status=exited" | grep "days ago" | awk '{print $1}' | xargs docker rm docker ps --filter "status=exited" | grep "days ago" | awk '{print $1}' | xargs docker rm docker ps --filter "status=exited" | grep "days ago" | awk '{print $1}' | xargs docker rm ( 信用 )

我手动运行以上的一些容器它错过了

修剪ps列表到:

 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e6dcd2915991 tensor-node-express "/bin/bash" 15 hours ago Exited (130) 15 hours ago flamboyant_bose 

但即使如此,我不能删除旧的图像 – 同样的错误。

进一步更新,我试图列出使用此脚本的图像( 信用 )的依赖关系:

  for i in $(docker images -q) do docker history $i | grep -q 74435614a991 && echo $i done | sort -u 

它告诉我:

 308238445d5c 74435614a991 f2f59eb61aae 

这意味着我的新图像是旧图像的子图像。 但是大小并不是看着磁盘大小的差异。

思考?

docker机使用Linux VM

当您查看.vdmk -machine .vdmk.iso文件时,您所看到的是在Mac上运行的Linux VM的文件。 这是需要的,因为Docker需要运行Linux内核function,它不能直接在Mac的微内核上运行。

所以你的Mac正在运行一个Linux虚拟机,在那个虚拟机里面运行着Docker守护进程和所有的容器。

因此, .vmdk.iso的文件大小不会告诉你任何一个图像。

docker工图像具有父/子关系

正如你可能已经知道,docker图像有父母和/或孩子。 例如,当你用这样的Dockerfilebuild立一个图像时:

 FROM ubuntu:latest RUN apt-get update && apt-get install nginx 

你会得到一个新的图像,你可能已经标记了my-nginx 。 但它需要ubuntu:latest形象作为其父母; 你不能删除ubuntu:latest的这个图像还在,因为它需要它的父母。

docker提交创build这些关系

当你使用docker commit ,你基本上正在做一个dynamic的快照构build。 它与上面类似,除了没有涉及到Dockerfile。

上面的例子有一个FROM行,表示要用作基础的图像。 使用提交时,有一个隐含的基础 – 无论使用哪个映像启动正在运行的正在运行的容器。

上面的例子有一个RUN命令,它将在构build的图像中创build新的内容,超出基本图像。 在一个真正的Dockerfile中,通常有多个命令可以在基本映像上进行各种操作。 当你使用提交,你没有这个。 相反,写入容器的任何东西都是新的内容。 它存在于容器中的读写文件系统层中。 那是你正在做的事情; 它被写成一个新的只读图层,并将其作为一个新的(不可变的,只读的)泊坞窗图像。 与父母。

根据你的意见和问题本身,你似乎相信使用docker commit会创build一个新的完整的图像,不依赖于其他图像。 那是不正确的。 你可以制作像这样的图像,如果你从头开始构build它们,就不会这样。

您可以取消标记图像

如果你想要的图像不显示在你的列表中,这很容易。 只是没有标记。

 docker rmi gcr.io/tensorflow/tensorflow:latest-devel 

但是,这或多或less是化妆品。 图像将仍然存在,因为另一个图像需要它。 所有这一切都是删除标记,所以它不会出现在docker images列表中没有-a标志。

试图这样做的原因不适合你,你试图使用它的ID,而不是使用它的标签rmi图像。