删除Docker中的旧图像 - OSX

时间:2017-03-16 12:36:29

标签: docker

我一直在玩Tensorflow的码头图像。

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

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

在此阶段,get '/'显示:

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提交存储差异图像,但当我转到$ 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/machine/machines/default

我认为5G文件是我的图像的组合,这似乎表明每个docker提交都是完整的图像!

关于我如何才能使用最新的泊坞窗图像(40894464 Mar 13 13:57 boot2docker.iso 5043847168 Mar 16 08:34 disk.vmdk )并释放我对入侵者入侵的HD的想法?

补充信息 - 这是tensor-node-express

的输出
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 credit

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

将ps列表修剪为:

docker ps --filter "status=exited" | grep "days ago" | awk '{print $1}' | xargs docker rm

但即使这样,我也无法删除旧图像 - 同样的错误。

进一步更新,我尝试列出图像中的依赖项(credit) 使用这个脚本:

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

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

思想?

1 个答案:

答案 0 :(得分:2)

docker-machine使用Linux VM

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

因此,您的Mac正在运行Linux虚拟机,并且该虚拟机内部正在运行Docker守护程序和所有容器。

因此,.vmdk.iso的文件大小不会告诉您任何一张图片。

docker图像具有父/子关系

您可能已经知道,码头图片中有父母和/或孩子。例如,使用像这样的Dockerfile构建映像时:

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

您最终会得到一个可能标记为my-nginx的新图像。但它需要ubuntu:latest图像作为其父级;您仍然无法删除此图片的ubuntu:latest,因为它需要其父级。

docker commit创建这些关系

使用docker commit时,您基本上是在进行动态快照构建。它与上面的类似,只是没有涉及Dockerfile。

上面的示例有一条FROM行,表示要用作基础的图像。使用提交时,隐含了一个基础 - 无论使用什么图像来启动您正在提交的正在运行的容器。

上面的示例有一个RUN命令,它将在构建的图像中创建基本图像之上和之外的新内容。在真正的Dockerfile中,通常有多个命令可以执行基于基本映像构建的各种操作。当您使用提交时,您没有。相反,在基本映像之上写入容器的任何内容都是您的新内容。它存在于容器中的读写文件系统层中。这就是你要做的事情;它被写为一个新的只读层,你可以将它作为一个新的(不可变的,只读的)docker镜像。有了父母。

根据您的评论和问题本身,您似乎相信使用docker commit会创建一个与其他图片无依赖关系的新完整图像。事实并非如此。如果你是从零开始自己构建它们,你可以制作这样的图像,而不是这样。

您可以取消标记图像

如果你想要的是图片没有显示在你的列表中,那很容易。只是解开它。

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

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

尝试此操作的原因不适用于您尝试使用其ID rmi图片,而不是使用其标记。