如何删除现有容器的挂载?

时间:2016-09-02 15:14:21

标签: docker containers volume

我正在学习码头工作并阅读他们的章节"管理容器中的数据"。在"将主机目录挂载为数据卷"。他们提到了以下段落:

  

除了使用-v标志创建卷之外,您还可以将Docker引擎主机中的目录安装到容器中。

$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
  

此命令将主机目录/ src / webapp安装到/ opt / webapp的容器中。如果路径/ opt / webapp已经存在于容器的映像中,则/ src / webapp挂载覆盖但不会删除预先存在的内容。删除安装后,可以再次访问该内容。这与mount命令的预期行为一致。

实验1

然后,当我尝试运行此命令并尝试检查容器时,我发现实际上容器甚至都没有运行。然后我使用docker logs web并找到此错误:

  

无法打开文件' app.py':[Errno 2]没有这样的文件或目录   我假设/ opt / webapp上的/ src / webapp挂载叠加,没有内容。

问题1 如何删除此挂载并检查内容是否仍然存在,如引用所示?

实验2

当我试图跑步时     $ docker run -d -P --name web2 -v newvolume:/ opt / webapp training / webapp python app.py 我发现容器运行正常。然后我使用docker exec -it web2 /bin/bash并发现所有现有内容仍在/ opt / webapp中。我也可以在这里添加更多文件。因此,在这种情况下,看起来音量不是叠加而是组合。如果我使用docker inspect web并检查Mounts,那么我将看到该卷是在/ var / lib / docker / volumes / newvolume / _data

下创建的

问题2 如果我给出一个名称而不是host-dir绝对路径,那么该卷不会覆盖container-dir / opt / webapp但是将两个dir连接在一起?

2 个答案:

答案 0 :(得分:0)

另一种解决方案是使用docker cli提交容器(或导出容器),然后不进行映射即可重新创建容器。

答案 1 :(得分:0)

问题1 :如何删除该安装座并检查报价是否仍包含内容?

您将创建一个没有卷挂载的新容器。例如

$ docker run -d -P --name web training/webapp python app.py

(从理论上讲,可以执行一些特权操作来删除正在运行的容器上的安装,但是在容器内部,您通常不会获得此权限,这是养成将容器视为临时容器的习惯,这是一个好习惯。)

问题2 :如果我提供名称而不是host-dir绝对路径,那么该卷将不会覆盖container-dir / opt / webapp,而是将两个dir连接在一起?

差不多。命名卷发生的事情是,当卷为空并且使用该卷装载创建容器时,docker提供了一个初始化步骤。初始化步骤将该目录下映像的内容复制到卷中,包括递归地包括所有文件和目录,所有权和权限。这对于以具有容器目录的用户必须能够写入的卷目录的非root用户身份运行容器非常有用。初始化发生后,即使图像内容已更改,例如具有相同名称的卷的将来的容器也将跳过初始化。如果您将新内容添加到图像中。