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

时间:2017-08-31 03:36:11

标签: docker nginx

我有一个版本为17.06.0-ce的泊坞广告。当我尝试使用docker使用命令安装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

它表明

docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "process_linux.go:339: container init caused \"rootfs_linux.go:57: mounting \\\"/appdata/nginx/conf/nginx.conf\\\" to rootfs \\\"/var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\" at \\\"/var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0/etc/nginx/nginx.conf\\\" caused \\\"not a directory\\\"\""
: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

如果不挂载nginx.conf文件,一切正常。那么,我该如何挂载配置文件呢?

感谢。

23 个答案:

答案 0 :(得分:89)

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

如何解决:

  1. 首先确保删除损坏的容器的卷
    docker rm -v <container_name>
  2. 打开Docker设置
  3. 转到&#34;共享硬盘&#34;标签
  4. 点击&#34;重置凭据...&#34;窗口底部的链接
  5. 重新共享要与Docker一起使用的驱动器
    • 系统会提示您输入用户名/密码
  6. 点击&#34;应用&#34;
  7. 转到&#34;重置&#34;标签
  8. 点击&#34;重启Docker&#34;
  9. 重新创建容器/卷
  10. Credit goes to BaranOrnarli on GitHub for the solution.

答案 1 :(得分:10)

因为泊坞广告将$PWD/conf/nginx.conf识别为文件夹而不是文件 检查$PWD/conf/目录是否包含nginx.conf为目录

尝试

> cat $PWD/conf/nginx.conf 
cat: nginx.conf/: Is a directory

否则,请打开Docker issue 它具有相同的配置,对我来说很好。

答案 2 :(得分:9)

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

docker rm -v <container_name>

<强>问题:

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

<强>解决方案:

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

docker volume rm $(docker volume ls -q)

答案 3 :(得分:3)

我知道这个问题是很久以前发布的,但是我仍然想回答我如何解决这个问题。

我正在使用Windows的Docker ToolBox。默认情况下,会自动安装 C驱动器,因此,要安装文件,请确保您的文件和文件夹位于 C驱动器内。

示例: C:\ Users \%USERNAME%\ Desktop

答案 4 :(得分:2)

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

enter image description here

答案 5 :(得分:2)

使用 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。因此,上面的错误。

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

修复:

  1. 转到VirtualBox,右键单击Default(来自Docker的VM)>设置>共享文件夹 enter image description here

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

enter image description here

  1. 以上内容将C:\projects映射到VM中的/projectsROOT/projects),这意味着现在您可以引用以下项目中的任何路径:/projects/project_name-因为{ project_name中的{1}}已安装。
  

要使用相对路径,请考虑将路径命名为C:\projects\project_name而不是c/projects

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

在我的docker文件中,我现在这样引用projects

nginx.conf

nginx.conf实际位于volumes: - /projects/project_name/docker_config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf 的位置

答案 6 :(得分:2)

我有同样的问题。我在Windows 10 17.09中将Docker Desktop与WSL一起使用。

问题原因: 问题在于,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 },现在一切正常。

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

答案 7 :(得分:1)

在Windows 10上通过以下命令行在WSL1上使用Docker时,我遇到了相同的问题:

echo $PWD
/mnt/d/nginx

docker run --name nginx -d \
  -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

我通过将主机系统上文件的路径更改为UNIX风格的绝对路径来解决它:

docker run --name nginx -d \
  -v /d/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

或将Windows样式的绝对路径与/代替\用作路径分隔符:

docker run --name nginx -d \
  -v D:/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

答案 8 :(得分:1)

在Windows 10中,我只是收到此错误,而没有更改我的docker-compose.yml文件或Docker配置中的任何内容。

在我的情况下,我使用的VPN带有阻止端口445的防火墙策略。

从VPN断开连接后,问题消失了。

因此,我建议在运行Docker Desktop时检查防火墙,而不使用代理或VPN。

检查Docker for windows - Firewall rules for shared drives以获得更多详细信息。

我希望这会对其他人有所帮助。

答案 9 :(得分:0)

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

$ docker container prune
$ docker volume prune

答案 10 :(得分:0)

请问您可以使用绝对路径/完整路径,而不是$ PWD / conf / nginx.conf。它将起作用

EX:docker run --name nginx-container5 --rm  -v /home/sree/html/nginx.conf:/etc/nginx/nginx.conf -d -p 90:80 nginx
b9ead15988a93bf8593c013b6c27294d38a2a40f4ac75b1c1ee362de4723765b

root@sree-VirtualBox:/home/sree/html# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
b9ead15988a9        nginx               "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds        0.0.0.0:90->80/tcp   nginx-container5
e2b195a691a4        nginx               "/bin/bash"              16 minutes ago      Up 16 minutes       0.0.0.0:80->80/tcp   test-nginx

答案 11 :(得分:0)

就我而言,这是Docker for Windows的问题,它使用由Bitlocker加密的分区。如果重新启动并解锁驱动器后加密文件上有项目文件,Dokcer将无法正确看到项目文件。

您需要做的就是重启Docker

答案 12 :(得分:0)

我遇到了同样的问题,docker-compose正在创建目录而不是文件,然后在中途崩溃。

我做了什么:

  1. 运行容器而不进行任何映射。

  2. .conf文件复制到主机位置:

    docker cp containername:/etc/nginx/nginx.conf ./nginx.conf

  3. 删除容器(docker-compose down)。

  4. 放回映射。

  5. 重新安装容器。

Docker Compose将找到.conf文件并映射,而不是尝试创建目录

答案 13 :(得分:0)

请注意,如果您尝试从主机上装入尚未添加到Docker Preferences的Resources> File Sharing部分中的卷,也会发生这种情况。

enter image description here

现在将根路径添加为文件共享资源将允许Docker访问该资源以将其安装到容器。请注意,您可能需要擦除Docker容器上的内容才能尝试重新安装该卷。

例如,如果您的应用程序位于/mysites/myapp,则需要将/mysites添加为文件共享资源位置。

答案 14 :(得分:0)

在Docker更新后,我在Windows10上遇到了相同的错误:2.3.0.2(45183)。

...导致\\\"not a directory\\\"\"":未知:您是否正在尝试将目录装载到文件上(反之亦然)?检查指定的主机路径是否存在并且是预期的类型

我正在使用像//C/workspace/nginx/nginx.conf这样的绝对路径,并且所有内容都像一个符咒。
更新中断了我的docker-compose,并且我不得不将路径更改为/C/workspace/nginx/nginx.conf,并用一个单独的/作为根。

答案 15 :(得分:0)

在Windows 7下,我遇到了这个问题,因为我的dockerfile位于不同的驱动器上。

这是我要解决的问题:

  1. 打开VirtualBox Manager
  2. 选择“默认”容器并编辑设置。
  3. 选择共享文件夹,然后单击图标以添加新的共享文件夹
  4. 文件夹路径:x:\
  5. 文件夹名称:/ x
  6. 检查自动安装并永久固定
  7. 重新启动虚拟机

此时,docker-compose up应该可以工作。

答案 16 :(得分:0)

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

./file:/dir/file

由于./file不存在,因此将其装入ABC(默认为文件夹)。

在我的情况下,我有一个容器来自

docker commit ABC cool_image

后来我创建./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

答案 17 :(得分:0)

我将在这里分享我的情况,因为这可能在将来为其他人节省很多时间。

我在macOS上使用了完美的docker-compose,直到开始在Gitlab CI中使用docker-in-docker。我只被授予在存储库中担任Master的权限,而Gitlab CI是由他人自行托管和设置的,并且没有共享任何其他信息,例如如何设置等。

以下是导致此问题的原因:

volumes:
  - ./.docker/nginx/wordpress/wordpress.conf:/etc/nginx/conf.d/default.conf

仅当我发现它可能在Windows下运行(花费数小时的时间)时,我才尝试将wodpress.conf重命名为default.conf并仅设置dir路径名:

volumes:
  - ./.docker/nginx/wordpress:/etc/nginx/conf.d

这解决了问题!

答案 18 :(得分:0)

对我来说,这不起作用:

volumes:
  - ./:/var/www/html
  - ./nginx.conf:/etc/nginx/conf.d/site.conf

但这可以正常工作(显然也将我的配置文件也移动到了新目录中:

volumes:
  - ./:/var/www/html
  - ./nginx/nginx.conf:/etc/nginx/conf.d/site.conf

答案 19 :(得分:0)

  

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

我在Mac环境中的niginx上遇到了类似的错误。 Docker无法正确识别default.conf文件。将相对路径更改为绝对路径后,错误已修复。

Range("N2").FormulaR1C1 = "=IF(ISNA(VLOOKUP(RC[-6],'[" & Wb.Name & "]" & WsPivot.Name & "'!R1C1:R20C18,2,FALSE)),0,VLOOKUP(RC[-6],'[" & Wb.Name & "]" & WsPivot.Name & "'!R1C1:R20C18,2,FALSE))"

答案 20 :(得分:0)

因为我没有本地文件,所以它具有相同的头划痕,因此它将其创建为文件夹。

mimas@Anttis-MBP:~/random/dockerize/tube$ ls
Dockerfile
mimas@Anttis-MBP:~/random/dockerize/tube$ docker run --rm -v $(pwd)/logs.txt:/usr/app/logs.txt devopsdockeruh/first_volume_exercise
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/Users/mimas/random/dockerize/tube/logs.txt\\\" to rootfs \\\"/var/lib/docker/overlay2/75891ea3688c58afb8f0fddcc977c78d0ac72334e4c88c80d7cdaa50624e688e/merged\\\" at \\\"/var/lib/docker/overlay2/75891ea3688c58afb8f0fddcc977c78d0ac72334e4c88c80d7cdaa50624e688e/merged/usr/app/logs.txt\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
mimas@Anttis-MBP:~/random/dockerize/tube$ ls
Dockerfile  logs.txt/

答案 21 :(得分:0)

将Virtual Box更新到6.0.10修复了Docker Toolbox的此问题

https://github.com/docker/toolbox/issues/844

我遇到这种错误:


mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects
$ touch resolv.conf

mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects
$ docker run --rm -it -v $PWD/resolv.conf:/etc/resolv.conf ubuntu /bin/bash
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/c/Users/mlepisto/G/Projects/resolv.conf\\\" to rootfs \\\"/mnt/sda1/var/lib/docker/overlay2/61eabcfe9ed7e4a87f40bcf93c2a7d320a5f96bf241b2cf694a064b46c11db3f/merged\\\" at \\\"/mnt/sda1/var/lib/docker/overlay2/61eabcfe9ed7e4a87f40bcf93c2a7d320a5f96bf241b2cf694a064b46c11db3f/merged/etc/resolv.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

# mounting to some other file name inside the container did work just fine
mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects/
$ docker run --rm -it -v $PWD/resolv.conf:/etc/resolv2.conf ubuntu /bin/bash
root@a5020b4d6cc2:/# exit
exit

更新VitualBox之后,所有命令都可以正常工作?

答案 22 :(得分:-1)

我已经解决了挂载问题,我处于win7环境中,同样的问题发生在我身上,显示“您是否正在尝试将目录挂载到文件上”。容器在wins C:\ Users \中具有默认的同步目录,所以我将项目移至C:\ Users \。然后重新创建项目。它可以正常工作。