我一直在玩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
这意味着我的新图像是旧图像的子图像。但是大小并不是考虑磁盘大小的差异。
思想?
答案 0 :(得分:2)
当您查看docker-machine .vdmk
和.iso
文件时,您正在查看的是Mac上运行的Linux VM的文件。这是必需的,因为Docker需要运行Linux内核功能,它不能直接在Mac的微内核上运行。
因此,您的Mac正在运行Linux虚拟机,并且该虚拟机内部正在运行Docker守护程序和所有容器。
因此,.vmdk
和.iso
的文件大小不会告诉您任何一张图片。
您可能已经知道,码头图片中有父母和/或孩子。例如,使用像这样的Dockerfile构建映像时:
FROM ubuntu:latest
RUN apt-get update && apt-get install nginx
您最终会得到一个可能标记为my-nginx
的新图像。但它需要ubuntu:latest
图像作为其父级;您仍然无法删除此图片的ubuntu:latest
,因为它需要其父级。
使用docker commit
时,您基本上是在进行动态快照构建。它与上面的类似,只是没有涉及Dockerfile。
上面的示例有一条FROM
行,表示要用作基础的图像。使用提交时,隐含了一个基础 - 无论使用什么图像来启动您正在提交的正在运行的容器。
上面的示例有一个RUN
命令,它将在构建的图像中创建基本图像之上和之外的新内容。在真正的Dockerfile中,通常有多个命令可以执行基于基本映像构建的各种操作。当您使用提交时,您没有。相反,在基本映像之上写入容器的任何内容都是您的新内容。它存在于容器中的读写文件系统层中。这就是你要做的事情;它被写为一个新的只读层,你可以将它作为一个新的(不可变的,只读的)docker镜像。有了父母。
根据您的评论和问题本身,您似乎相信使用docker commit
会创建一个与其他图片无依赖关系的新完整图像。事实并非如此。如果你是从零开始自己构建它们,你可以制作这样的图像,而不是这样。
如果你想要的是图片没有显示在你的列表中,那很容易。只是解开它。
docker rmi gcr.io/tensorflow/tensorflow:latest-devel
然而,这或多或少是化妆品。图像仍将存在,因为另一个图像需要它。所有这一切都是删除标记,因此如果没有docker images
标记,它就不会出现在-a
列表中。
尝试此操作的原因不适用于您尝试使用其ID rmi
图片,而不是使用其标记。