docker run ubuntu /bin/bash -c 'sudo rm -rf ./mydir; ls'
我使用ubuntu 14.04作为主机和图像.
编辑:
解决方法
>图像和容器之间的用户混淆.每个docker run都会创建一个新容器,容器中的任何更改(如删除目录或运行修改文件系统的内容)都会与原始映像和所有其他容器隔离.
> Aufs layering bug/feature.查看docker信息以查看您是否使用存储驱动程序aufs或imagemapper.要重新安装docker以使用imagemapper:将任何不可替代的唯一映像备份到tar文件,删除docker.io,按照official install docs中的说明从ppa安装lxc-docker并更改/ etc / default / docker以包含DOCKER_OPTS =“ – storage -driver = devicemapper”
它也可能是一个反模式来提交目录然后删除它们,因为那些数据可能仍然存在于某处.即使它从文件系统中消失,它仍然可能在内部浪费空间.
Docker镜像是按层构建的,每个提交都是一个层.
要查看此内容,请尝试泊坞历史记录< image>看看你的形象是什么.
第一种情况是值得一个简短的例子,但看起来你可能正在经历第二种情况.
图像与容器和删除目录
让我们从ubuntu创建一个名为mystuff的私有映像:14.04,稍后,尝试rm -rf / opt:
$docker run -it ubuntu:14.04 /bin/bash root@435e68479c5b:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@435e68479c5b:/# exit $docker commit 435e6 mystuff
让我们看看里面(-t仅用于在一行上进行漂亮打印):
docker run -t mystuff ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
现在让我们尝试删除/ opt(通常这是可选的东西,可以安全删除):
docker run -t mystuff rm -rf /opt
然后在里面寻找它,它仍然存在! (好像报道的问题):
docker run -t mystuff ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
发生了什么?
>每次使用docker运行mystuff时,它都会从图像mystuff中创建一个新容器
>除非使用docker commit,否则不会提交对映像的更改
如果您查看容器,则会发生以下更改:
docker ps -a ... lots of stuff... e9e8be13d928 mystuff:latest "rm -rf /opt" 2 minutes ago Exited (0) 2 minutes ago nostalgic_archimedes
得到一个tarball并寻找选择,grep it for dir以opt开头,它不存在!:
docker export e9e8 | tar tv | grep ^opt
注意:e9e8特别适合我的这个例子.要引用容器,可以在第一个col中使用docker ps中的部分十六进制字符串.
现在我将具有rm -rf更改的容器提交到新映像noopt:
docker commit e9e8 noopt
并查看从noopt创建的容器:
docker run -t noopt ls bin boot dev etc home lib lib64 media mnt proc root run sbin srv sys tmp usr var
果然,选择已经消失了!
但是因为docker图像是分层的,所以分发noopt会包含/ opt in一个早期的历史图像,所以你不能阻止其他人取回它:
docker history noopt IMAGE CREATED CREATED BY SIZE bc4e69f9e871 59 minutes ago rm -rf /opt 0 B d198d23dab38 About an hour ago /bin/bash 3 B 04c5d3b7b065 9 days ago /bin/sh -c #(nop) CMD [/bin/bash] 0 B d735006ad9c1 9 days ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB 70c8faa62a44 9 days ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB c7b7c6419568 9 days ago /bin/sh -c #(nop) ADD file:d4aab24fc178303dc0 192.5 MB 511136ea3c5a 18 months ago 0 B
要在删除/ opt之前返回到图层,我们只需要选择d198d …并运行它
docker run -t d198d23dab38 ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
摘要:
> Docker有容器和图像.
>图像旨在更持久.
>图像是在称为提交的层中创建的,在概念上类似于git存储库
>容器是根据图像创建的,容器中的更改不会保留在图像中(除非显式提交)
Docker还有一个很棒的构建系统,应该在这里使用.编写该脚本的人应该学习docker build并编写适当的Dockerfile
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。