似乎docker容器中的rm -rf
仅适用于文件。
docker run ubuntu /bin/bash -c 'sudo rm -rf ./mydir; ls'
它在目录中列出mydir
而不打印任何错误。
我使用ubuntu 14.04作为主机和图像。
修改
我认为在我将另一个文件添加到目录后出现了错误,但我错了。最后,更改存储驱动程序有助于解决问题。
答案 0 :(得分:6)
如果您似乎无法删除目录,则有两种可能:
docker run
创建一个新容器,容器中的任何更改(如删除目录或运行修改文件系统的内容)都是隔离的从原始图像和所有其他容器。 docker info
以查看您是否正在使用存储驱动程序aufs或imagemapper。要重新安装docker以使用imagemapper:将任何不可替代的唯一映像备份到tar文件,删除docker.io,按照official install docs中的说明从ppa安装lxc-docker并更改/etc/default/docker
以包含{{1} }} 它也可能是提交目录然后删除它们的反模式,因为那些数据可能仍然存在于某处。即使它从文件系统中消失,它仍然可能在内部浪费空间。
Docker镜像是按层构建的,每个提交都是一个层
要查看此内容,请尝试DOCKER_OPTS="--storage-driver=devicemapper"
查看图片中的内容。
第一种情况是值得一个简短的例子,但看起来你可能正在经历第二种情况。
让我们从docker history <image>
创建一个名为mystuff
的私有图片,稍后,尝试rm -rf / opt:
ubuntu:14.04
让我们看看里面($ 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 run mystuff
如果您查看容器,则会有更改:
mystuff
获取tarball并寻找选择,从选择开始为dir grep它,它不在那里!:
docker ps -a
... lots of stuff...
e9e8be13d928 mystuff:latest "rm -rf /opt" 2 minutes ago Exited (0) 2 minutes ago nostalgic_archimedes
注意:docker export e9e8 | tar tv | grep ^opt
特别适用于此示例。要引用容器,可以使用第一个列中e9e8
的部分十六进制字符串。
现在我将具有rm -rf更改的容器提交到新图像docker ps
:
noopt
查看从noopt创建的容器:
docker commit e9e8 noopt
果然,选择已经消失了!
但是因为docker图像在图层中,所以分发noopt将包含/ opt在之前的历史图像中,因此您无法阻止其他人获取它:
docker run -t noopt ls
bin boot dev etc home lib lib64 media mnt proc root run sbin srv sys tmp usr var
要在删除/ opt之前返回图层,我们只需要选择d198d并运行它
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
要点:
Docker还有一个很棒的构建系统,应该在这里使用。编写该脚本的人应该学习docker run -t d198d23dab38 ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
并编写适当的Dockerfile
答案 1 :(得分:1)
要从/
的容器中删除目录“ to_remove”docker exec -t <container_name/container_id> /bin/sh 'rm -rf to_remove'
要从目录中删除文件to_remove从容器中
docker exec -t <container_name/container_id> /bin/sh 'rm -rf to_remove/<file_name>'
要从目录to_remove中删除目录中的所有文件
docker exec -t <container_name/container_id> /bin/sh 'rm -rf to_remove/<file_name>'
要从/ path / target_dir / 未经测试
的容器中删除目录“ to_remove”docker exec -t <container_name/container_id> /bin/sh 'rm -rf /path/target_dir/to_remove/'
答案 2 :(得分:1)
如果在尝试删除目录时权限被拒绝,请尝试以root用户将其删除。 必须启动容器才能运行此命令。
docker exec -u root -it <CONTAINER_NAME/ID> rm -rf <DIRECTORY_TO_DELETE>
答案 3 :(得分:0)
我使用 rm -r -f 命令删除了docker容器中的文件