在 Docker 中使用相对路径挂载本地文件或目录时,可能会遇到无法挂载的问题。这通常是由于 Docker 容器并不知道上层目录中相对路径的存在而造成的。
以下是如何解决这个问题的完整攻略:
问题描述
在 Docker 中使用 docker run
命令时,使用相对路径挂载本地文件或目录时可能会提示文件不存在或权限不足等错误,如下:
docker run -v ./test:/app/test -it ubuntu:latest
docker: Error response from daemon: Bind mount failed: ./test:/app/test destination is not empty.
或者是
docker run -v $(pwd)/test:/app/test -it ubuntu:latest
docker: Error response from daemon: Mounts denied: The path /test is not shared from the host and is not known to Docker. You can configure shared paths from Docker -> Preferences... : Path /test
解决方案
使用绝对路径
使用绝对路径来挂载本地文件或目录,可以避免相对路径的问题。可以使用 pwd
命令来获取当前目录的绝对路径,如下:
docker run -v /home/user/test:/app/test -it ubuntu:latest
使用Dockerfile
可以使用 Dockerfile 定义容器的目录结构和依赖,从而避免使用相对路径挂载本地文件或目录的问题。
FROM ubuntu:latest
RUN mkdir /app
COPY test /app/test
构建 Docker 镜像并运行容器,如下:
docker build -t my_app .
docker run -it my_app
在 Dockerfile 中使用 COPY
命令将本地的 test
目录复制到容器的 /app/test
目录中。这样运行容器时,就不需要使用相对路径挂载本地文件或目录了。
需要注意:如果要在 Dockerfile 中使用 COPY
命令,请确保本地的 test
目录与 Dockerfile 在同一个目录下,否则会出现 file not found
错误。
示例
以下是两个示例:
示例 1
在本地先创建一个文件夹 my_app
,并在其中创建一个文件 test.txt
。然后使用绝对路径挂载本地文件夹。
mkdir /home/user/my_app
echo "Hello World!" > /home/user/my_app/test.txt
docker run -v /home/user/my_app:/app/my_app -it ubuntu:latest
在容器内,进入 /app/my_app
目录,可以看到本地的 my_app
文件夹和 test.txt
文件。
示例 2
在本地创建一个 Dockerfile。在 Dockerfile 中,将本地的 my_app
文件夹复制到容器中。
FROM ubuntu:latest
RUN mkdir /app
COPY my_app /app/my_app
在 my_app
文件夹中创建一个 test.txt
文件,然后执行以下命令构建 Docker 镜像并运行容器。
mkdir /home/user/my_app
echo "Hello World!" > /home/user/my_app/test.txt
cd /home/user/my_app
touch Dockerfile
# 编辑 Dockerfile,内容如上
docker build -t my_app .
docker run -it my_app
在容器内,进入 /app/my_app
目录,可以看到本地的 my_app
文件夹和 test.txt
文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决docker run中使用 ./ 相对路径挂载文件或目录失败的问题 - Python技术站