![Docker添加后找不到文件](https://linux22.com/image/81442/Docker%E6%B7%BB%E5%8A%A0%E5%90%8E%E6%89%BE%E4%B8%8D%E5%88%B0%E6%96%87%E4%BB%B6.png)
我正在尝试使用 ADD 将压缩文件本地复制到容器:
RUN mkdir /root/foo
ADD foo.zip /root/foo/
UNZIP -o /root/foo/foo.zip
然后我构建并运行容器并进入 bash:
sudo docker run -it -p 8080:8080 tomcat bash
当我进入目录 /root/foo/ 时,找不到该目录。我应该怎么做才能在容器中创建目录并查看 foo.zip 的内容?
答案1
将主机目录挂载为数据卷
除了使用 -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 命令的预期行为一致。
容器目录必须始终是绝对路径,例如 /src/docs。 host-dir 可以是绝对路径或名称值。如果您为主机目录提供绝对路径,Docker 会绑定安装到您指定的路径。如果您提供名称,Docker 将使用该名称创建一个命名卷。
名称值必须以字母数字字符开头,后跟 a-z0-9、_(下划线)、.。 (句点)或 -(连字符)。绝对路径以 /(正斜杠)开头。
例如,您可以指定 /foo 或 foo 作为 host-dir 值。如果您提供 /foo 值,Docker 会创建一个绑定安装。如果您提供 foo 规范,Docker 会创建一个命名卷。
如果您在 Mac 或 Windows 上使用 Docker Machine,则您的 Docker 守护进程对 OS X 或 Windows 文件系统的访问权限有限。 Docker Machine 尝试自动共享您的 /Users (OS X) 或 C:\Users (Windows) 目录。因此,您可以使用以下命令在 OS X 上挂载文件或目录。
docker run -v /Users/<path>:/<container path> ...
在 Windows 上,使用以下命令挂载目录:
docker run -v /c/Users/<path>:/<container path> ...`
所有其他路径都来自虚拟机的文件系统。例如,如果您使用 VirtualBox 来共享其他一些文件夹,则需要执行额外的工作。对于 VirtualBox,您需要将主机文件夹作为 VirtualBox 中的共享文件夹使用。然后,您可以使用 Docker -v 标志安装它。
挂载主机目录对于测试很有用。例如,您可以将源代码安装在容器内。然后,更改源代码并实时查看其对应用程序的影响。主机上的目录必须指定为绝对路径,如果该目录不存在,Docker 会自动为您创建它。主机路径的自动创建已被弃用。
Docker 卷默认以读写模式挂载,但您也可以将其设置为只读挂载。
$ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
在这里,我们挂载了相同的 /src/webapp 目录,但我们添加了 ro 选项来指定挂载应该是只读的。
由于挂载功能的限制,移动主机源目录中的子目录可以提供从容器到主机文件系统的访问权限。这需要恶意用户能够访问主机及其安装目录。
Note: The host directory is, by its nature, host-dependent. For this reason, you can’t mount a host directory from Dockerfile because built images should be portable. A host directory wouldn’t be available on all potential hosts.