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


92

我有一个版本为docker的码头工人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:来自守护程序的错误响应:oci运行时错误:container_linux.go:262:启动容器进程导致“ process_linux.go:339:容器初始化引起了\“ rootfs_linux.go:57:安装\\” / appdata / nginx / conf / nginx.conf \\“到rootfs \\” / var / lib / docker / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 \\\“在\\” / var / lib / docker / aufs / mnt / dcea22444e9ffda114593b18finf8a4f4a4a4a47f4a8a47f4a0f47a1a0f0f0f0f0ff0f0f0f0f0f0b0f0b0f0f0bf0b0f0bf0f0e \\“导致\\”不是目录\\“:您是否正在尝试将目录挂载到文件上(反之亦然)?检查指定的主机路径是否存在以及是否为预期的类型。

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


输出是ls -al .什么?想看看您的密码是什么样子。
Tri Nguyen

1
就我而言,我意外地将目录从主机映射到容器中的文件。重新启动容器不再起作用。我必须删除容器(docker rm …),然后重新创建它。
slhck

Answers:


26

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

测试

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

否则,请打开Docker问题
使用相同的配置,对我来说工作正常。


作为一名中级Linux用户,我很好奇,Linux将其识别为文件夹而不是文件的原因是什么?
J. Scott Elblein

因为它实际上是一个文件夹。如果该文件不存在,则泊坞窗会由于volume参数而创建一个文件夹-v
Mathieu Lescaudron

好的,因此如果码头工人由于先前不存在的路径而不得不创建它,则Linux仅将其识别为文件夹;但是,如果nginx.confLinux以前已经在该路径中存在该文件,Linux会将其识别为文件,对吗?
J. Scott Elblein

137

(从v2.2.0.0版本开始)不再应该发生这种情况,请参见此处


如果您使用的是Windows的Docker,则最近更改密码时可能会发生此错误。

怎么修:

  1. 首先,请确保删除损坏的容器的卷
    docker rm -v <container_name>
    更新:以下步骤可能会起作用,而无需先删除卷。
  2. 打开Docker设置
  3. 转到“共享驱动器”选项卡
  4. 单击窗口底部的“重置凭据...”链接
  5. 重新共享您想与Docker一起使用的驱动器
  • 应该提示您输入用户名/密码
  1. 点击“应用”
  2. 转到“重置”标签
  3. 点击“重启Docker”
  4. 重新创建您的容器/卷

有关解决方案,请访问GitHub上的BaranOrnarli。


2
谢谢!它从第二步开始对我有效,而避免了最后一步。
Mateo Hermosilla

1
通过第2步开始并省略了最后一个,我得以解决此问题。我不必破坏容器/体积即可再次安装。
克里斯蒂安·恩格尔

我同意@MateoHermosilla,它不需要检测容器,只需“重置凭据”
sintetico82,2018年

安装沙盒代理(hadoop)时尝试运行proxy-deploy.sh时遇到相同的错误。在此之后。没有解决。
Vaibhav

2
这是我的问题。密码重置每隔几个月进行一次,因此我忘了在Docker中重置Shared Drive凭据。
安德斯·托恩布拉德

41

TL; DR:删除与容器关联的卷。

使用查找容器名称,docker ps -a然后使用以下方法删除该容器:

docker rm -v <container_name>

问题:

如果您以前尝试docker run文件时运行命令,则可能会遇到您遇到的错误不存在于主机目录中的位置,则。

在这种情况下,docker守护程序会在其位置的容器内创建一个目录,此目录后来在正确的文件放入主机目录中并再次运行docker命令时无法映射到正确的文件。

解:

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

docker volume rm $(docker volume ls -q)

原始问题中的命令仅列出了正在使用的主机卷。该docker volume命令/界面仅适用于匿名卷和命名卷,它们不属于原始问题。
programmerq

@programmerq查看错误,并尝试以/var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\"我的推断进行挂载,挂载失败:由于之前的运行,它已经有一个文件夹,因此,如果您尝试将文件映射到该文件夹​​,它将失败。
Ayushya

在这里,可能有两件事出了错,要么主机有错,要么已创建的卷有错。假设主持人是正确的,我认为最好清除现有数量的问题。
Ayushya

1
当容器已与某个卷关联并且该卷的类型在下一次运行中更改时,这实际上是一个有效的答案。因此,删除音量可能会有所帮助!
Yan Foto 2017年

1
这很有帮助。就我而言,问题确实是我仍然定义了旧容器。使用docker rm打包它们,然后进行docker-compose正常工作。
Max Tardiveau

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,右键单击“默认”(来自Docker的VM)>“设置”>“共享文件夹” 在此处输入图片说明

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

在此处输入图片说明

  1. 上面的内容将映射C:\projects到VM中的/projectsROOT/projects),这意味着现在您可以引用以下项目中的任何路径:/projects/project_name-因为现在已安装project_namefrom C:\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

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


7

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

$ docker container prune
$ docker volume prune

6

我有同样的问题。我在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

就像这本引人注目的指南中所建议的那样:设置Windows和WSL的Docker可以正常工作,并且现在一切正常。

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



4

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

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


1
我挂载的文件夹是C:\ x-suite \; 我共享了C盘,但是仍然没有解决我的问题
袁文涛

您在使用Docker ToolBox吗?
阿卜舍舍克DK

minikube + virtualBox + docker ToolBox,localkube已弃用,我应该使用什么驱动程序?
袁文涛

如果您是从Dockercompose挂载的,则使用$ {pwd} / <path>
Abhishek DK

1
如果您使用的是Dockerfile,请使用VOLUME / c / x-suite
Abhishek DK

2

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

./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

谢谢,这也是我的问题,因为我有相当复杂的Docker设置!
rmcsharry

1

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

就我而言,我使用的VPN带有阻止端口445的防火墙策略。

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

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

检查Docker的Windows-共享驱动器的防火墙规则以获取更多详细信息。

我希望这会帮助其他人。


1

您能否使用绝对/完整路径代替$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

如果您使用双引号将其转义:docker run -d --rm -v“ $ PWD / nginx.conf:/etc/nginx/nginx.conf” nginx应该没有什么不同,因为shell会在传递它之前对其进行翻译到docker运行,实际上,这并没有什么不同,至少对我来说没有
Manumie

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

使用Windows样式路径和Unix样式路径时,您是否注意到任何性能差异?
J. Scott Elblein

我不知道 我只是使用Docker for Windows进行测试/开发,而从未监控性能。
bwibo

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之后,所有命令都可以正常工作🎉


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/

0

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

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

      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

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

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

这样就解决了问题!


0

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

这是我为解决此问题所做的工作:

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

在这一点上,docker-compose up应该工作。


0

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

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

我使用了这样的绝对路径,//C/workspace/nginx/nginx.conf并且一切都像个魅力。
更新中断了我的docker-compose,我不得不将路径更改为以根目录/C/workspace/nginx/nginx.conf为单一路径/


0

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

在此处输入图片说明

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

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


0

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

我做了什么:

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

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

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

  3. 取出容器(docker-compose down)。

  4. 放回映射。

  5. 重新安装容器。

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


-2

我已经解决了挂载问题。我正在使用Win 7环境,同样的问题也发生在我身上。

您是否正在尝试将目录挂载到文件上?

该容器的默认同步目录位于C:\Users\,因此我将项目移至C:\Users\,然后重新创建了该项目。现在可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.