您是否尝试将目录挂载到文件上(反之亦然)?

Ste*_*Luo 48 nginx docker

我有一个版本的码头工具17.06.0-ce.当我尝试使用docker with command安装nginx时:

docker run -p 80:80 -p 8080:8080 --name nginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx:latest
Run Code Online (Sandbox Code Playgroud)

它表明了这一点

docker run -p 80:80 -p 8080:8080 --name nginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx:latest
Run Code Online (Sandbox Code Playgroud)

如果不挂载nginx.conf文件,一切都还可以.那么,我该如何挂载配置文件呢?

谢谢.

Jes*_*ebb 121

如果您使用的是Docker for Windows,如果您最近更改了密码,则会发生此错误.

怎么修:

  1. 首先确保删除损坏的容器的卷
    docker rm -v <container_name>
  2. 打开Docker设置
  3. 转到"共享驱动器"选项卡
  4. 单击窗口底部的"重置凭据..."链接
  5. 重新共享要与Docker一起使用的驱动器
    • 系统会提示您输入用户名/密码
  6. 点击"申请"
  7. 转到"重置"标签
  8. 点击"重启Docker"
  9. 重新创建容器/卷

感谢GitHub上的BaranOrnarli提供的解决方案.

  • 谢谢!它适用于我从第二步开始,避免使用最后一步. (2认同)
  • 这就是我的问题。密码重置是每隔几个月,所以我总是忘记在 Docker 中重置共享驱动器凭据。 (2认同)

Ayu*_*hya 16

删除与容器关联的卷.找到容器名称docker ps -a然后使用以下命令删除容器:

docker rm -v <container_name>
Run Code Online (Sandbox Code Playgroud)

问题:

如果您之前尝试运行docker run命令,而该文件不在其应位于主机目录中的位置,则可能会出现您所面临的错误.在这种情况下,docker守护程序会在其位置的容器内创建一个目录.当正确的文件放入主机目录并再次运行docker时,后来无法映射到正确的文件.

解:

删除与容器关联的卷.如果您不关心其他容器卷,您还可以使用:

docker volume rm $(docker volume ls -q)
Run Code Online (Sandbox Code Playgroud)


Mat*_*ron 14

因为docker识别$PWD/conf/nginx.conf文件夹而不是文件.
检查$PWD/conf/目录是否包含nginx.conf作为目录.

试试吧

> cat $PWD/conf/nginx.conf 
cat: nginx.conf/: Is a directory
Run Code Online (Sandbox Code Playgroud)

否则,打开Docker问题.
它配置相同,对我来说很好.

  • 好的,所以只有当 docker 由于路径先前不存在而必须创建它时,Linux 才会将其识别为文件夹;但是如果 `nginx.conf` 之前已经存在于该路径中,Linux 会将其识别为一个文件,对吗? (5认同)
  • 作为一个中级 Linux 用户,我很好奇,Linux 为何将其识别为文件夹而不是文件? (2认同)
  • 因为它实际上是一个文件夹。如果文件不存在,docker 会因为卷参数 `-v` 创建一个文件夹 (2认同)

vio*_*rel 7

使用Docker Toolbox 的人的答案

这里至少有 3 个答案涉及这个问题,但没有正确解释,也没有给出完整的解决方案。这只是一个文件夹安装问题

问题描述:

Docker Toolbox 通过创建虚拟机(在捆绑的 VirtualBox 中)绕过了 Docker 的 Hyper-V 要求。Docker 已安装并在 VM 内运行。为了使 Docker 正常运行,它需要能够从主机访问 。这里没有。

在我安装 Docker Toolbox 之后,它创建了 VirtualBox VM 并且只安装C:\Users到机器上,作为\c\Users\. 我的项目在C:\projects安装的卷上无处可去。当我将路径发送到 VM 时,它不存在,因为C:\projects没有安装。因此,上面的错误。

假设我的项目包含我的 ngnix 配置 C:/projects/project_name/

修复它:

  1. 转到 VirtualBox,右键单击 Default(来自 Docker 的 VM)> 设置 > 共享文件夹 在此处输入图片说明

  2. 单击右侧带加号的小图标,添加新共享。我使用了以下设置:

在此处输入图片说明

  1. 上面的内容将映射C:\projects到VM 中的/projects( ROOT/projects),这意味着现在您可以像这样引用项目中的任何路径:/projects/project_name- 因为project_namefromC:\projects\project_name现在已挂载。

要使用相对路径,请考虑命名的路径c/projectsprojects

  1. 重新启动一切,它现在应该可以正常工作了。我在 VirtualBox 中手动停止了虚拟机并重新启动了 Docker Toolbox CLI。

在我的 docker 文件中,我现在引用nginx.conf如下:

volumes:
    - /projects/project_name/docker_config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
Run Code Online (Sandbox Code Playgroud)

nginx.conf 实际所在的位置 C:\projects\project_name\docker_config\nginx\nginx.conf


And*_*own 7

@Ayushya 给出的解释是我遇到这个有点令人困惑的错误消息的原因,并且可以像这样轻松完成必要的内务处理:

$ docker container prune
$ docker volume prune
Run Code Online (Sandbox Code Playgroud)


小智 6

我有同样的问题。我在 Windows 10 17.09 中使用带有 WSL 的 Docker 桌面。

问题原因:

问题是 Docker for Windows 希望您以与此匹配的格式提供卷路径:

/c/Users/username/app

但是,WSL 使用以下格式:

/mnt/c/Users/username/app

这令人困惑,因为在控制台中检查文件时我看到了它,对我来说一切都是正确的。我不知道 Docker for Windows 对卷路径的期望

问题的解决方法:

我绑定了自定义挂载点来修复 Docker for Windows 和 WSL 的差异:

sudo mount --bind /mnt/c /c

就像这个惊人的指南中所建议的那样:为 Windows 和 WSL 设置 Docker 以完美地工作,现在一切都完美无缺。

在我开始使用 WSL 之前,我使用的是 Git Bash,我也遇到了这个问题。


Yur*_*iak 5

也许有人觉得这很有用。我的撰写文件安装了以下卷

./file:/dir/file
Run Code Online (Sandbox Code Playgroud)

由于 ./file 不存在,因此它被挂载到 ABC 中(默认为文件夹)。

就我而言,我有一个容器是由

docker commit ABC cool_image
Run Code Online (Sandbox Code Playgroud)

当我后来创建 ./file 并运行时docker-compose up,出现错误:

[...] 您是否正在尝试将目录挂载到文件上(或反之亦然)?检查指定的主机路径是否存在并且是预期的类型。

启动的容器cool_image记得那/dir/file是一个目录,它与最近创建和安装的目录冲突./file

解决方案是:

touch ./file
docker run abc_image --name ABC -v ./file:/dir/file
# ... desired changes to ABC
docker commit ABC cool_image
Run Code Online (Sandbox Code Playgroud)


Cle*_*ens 5

在我的 Mac 上,我必须取消选中“设置 -> 常规”中的“使用 gRPC FUSE 进行文件共享”框

在此处输入图片说明

  • 谢谢这解决了我的问题。我还在实验功能部分中关闭了使用 Docker Compose v2。 (2认同)