如何删除docker中的目录?

时间:2014-12-24 19:44:36

标签: ubuntu docker

似乎docker容器中的rm -rf仅适用于文件。

docker run ubuntu /bin/bash -c 'sudo rm  -rf ./mydir; ls'

它在目录中列出mydir而不打印任何错误。

我使用ubuntu 14.04作为主机和图像。

修改

我认为在我将另一个文件添加到目录后出现了错误,但我错了。最后,更改存储驱动程序有助于解决问题。

4 个答案:

答案 0 :(得分:6)

如果您似乎无法删除目录,则有两种可能:

  1. 图像和容器之间的用户混淆。每个docker run创建一个新容器,容器中的任何更改(如删除目录或运行修改文件系统的内容)都是隔离的从原始图像和所有其他容器。
  2. Aufs layering bug/feature。查看docker info以查看您是否正在使用存储驱动程序aufs或imagemapper。要重新安装docker以使用imagemapper:将任何不可替代的唯一映像备份到tar文件,删除docker.io,按照official install docs中的说明从ppa安装lxc-docker并更改/etc/default/docker以包含{{1} }}
  3. 它也可能是提交目录然后删除它们的反模式,因为那些数据可能仍然存在于某处。即使它从文件系统中消失,它仍然可能在内部浪费空间。

    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
    • 中生成新容器
    • 除非您使用docker commit
    • ,否则不会提交对图像的更改

    如果您查看容器,则会有更改:

    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有容器和图像。
      • 图像旨在更持久。
      • 图像是在名为提交的图层中创建的,在概念上类似于git存储库
      • 容器是根据图像创建的,容器中的更改不会保留在图像中(除非明确提交)

    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容器中的文件