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

我有一个版本 17.06.0-ce的多克。当我试图安装 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: 来自 daemon: oci 运行时错误的错误响应: Container _ linux. go: 262: 引发启动容器进程 ”process _ linux. go: 339: Container init cause“ rootfs _ linux. go: 57: 将“/appdata/nginx/conf/nginx.conf”挂载到 rootfs “/var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0” 在 “/var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0/etc/nginx/nginx.conf” 导致“不是一个目录” : 是否尝试将目录挂载到文件中(或者反之亦然) ?检查指定的主机路径是否存在并且是预期的类型。

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

184574 次浏览

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

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

docker rm -v <container_name>

问题:

如果您以前尝试运行 docker run命令,而 文件没有出现在应该在主机目录中的位置,则可能会出现错误。

在这种情况下,docker 守护进程会在容器内部创建一个 目录代替原来的位置,当正确的文件放入主机目录并再次运行 docker 命令时,这个 目录将无法映射到正确的文件。

解决方案:

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

# WARNING, THIS WILL REMOVE ALL VOLUMES
docker volume rm $(docker volume ls -q)

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

测试

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

否则,打开 码头装备
它的工作原理相同的配置对我来说很好。

这种情况不应该再发生(自2.2.0.0版本以来) ,请参阅 给你


如果您使用的是 窗口码头,那么如果您最近更改了密码,则可能会发生此错误。

解决方法:

  1. 首先确保删除破损容器的容量
    docker rm -v <container_name>
    更新: 下面的步骤可能不需要先删除卷。
  2. 打开 Docker 设置
  3. 进入“共享驱动器”选项卡
  4. 点击窗口底部的“重置凭证...”链接
  5. 重新共享要与 Docker 使用的驱动器
  • 系统会提示您输入用户名/密码
  1. 点击“申请”
  2. 进入“重置”选项卡
  3. 点击“重启码头”
  4. 重新创建容器/卷

这个解决方案归功于 GitHub 上的 BaranOrnarli。

你能用绝对/完全路径代替 $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

我正在为 Windows 使用 Docker 工具箱。默认情况下,C 盘是自动挂载的,因此为了挂载文件,请确保您的文件和文件夹位于 C 盘中。

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

我已经解决了安装问题。我使用一个 Win 7环境,同样的问题发生在我身上。

您正在尝试将目录挂载到文件中吗?

该容器在 C:\Users\处有一个默认的同步目录,因此我将项目移动到 C:\Users\,然后重新创建项目。现在起作用了。

我也有同样的问题,我在 Windows 1017.09中使用 Docker Desktop 和 WSL。

问题的原因:

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

/c/Users/username/app

但是,WSL 使用了这种格式:

/mnt/c/Users/username/app

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

问题的解决方案:

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

sudo mount --bind /mnt/c /c

就像在这个惊人的指南建议: 为 Windows 和 WSL 设置 Docker 使其完美工作和一切都是完美的工作现在。

在我开始使用 WSL 之前,我使用的是 GitBash,我也有这个问题。

将 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 之后,所有的命令都能正常工作

有相同的头部划伤,因为我没有本地的文件,所以它创建了一个文件夹。

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/

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

我在 Mac 环境中的 niginx 也有类似的错误。 Docker 没有正确识别 default.conf 文件。

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

对我来说,这没有奏效:

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

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

我有一个完美的工作码头组合在我的 macos,直到我开始使用在 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

这解决了问题!

为使用 码头工具箱的人解答

这里至少有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/中包含 nnix 配置

解决办法:

  1. 转到 VirtualBox,右键单击 Default (the VM from Docker) > Settings > Shared Folders enter image description here

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

enter image description here

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

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

  1. 重新启动所有程序,现在应该可以正常工作了。我手动停止 VirtualBox 中的虚拟机并重新启动 Docker ToolboxCLI。

在我的 Docker 文件中,我现在这样引用 nginx.conf:

volumes:
- /projects/project_name/docker_config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf

C:\projects\project_name\docker_config\nginx\nginx.conf中 nginx.conf 实际驻留在哪里

也许有人觉得这个有用。我的作文文件有以下卷挂载

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

@ Ayushya 给出的解释是我点击这个有点令人困惑的错误消息的原因,必要的内务管理工作可以这样简单地完成:

$ docker container prune
$ docker volume prune

在 Windows10中,我只是在没有修改 docker-compose.yml文件或 Docker 配置的情况下得到这个错误。

在我的案例中,我使用的是带有防火墙策略的 VPN,该策略阻止端口445。

断开与 VPN 的连接后,问题就消失了。

因此,我建议检查您的防火墙,不要使用代理或 VPN 时,运行 Docker 桌面。

查看 窗口的 Docker. 共享驱动器的防火墙规则了解更多细节。

我希望这能帮到别人。

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

下面是我为解决这个问题所做的:

  1. 打开 VirtualBox 管理器
  2. 选择“ default”容器并编辑设置。
  3. 选择 Shared Folders 并单击该图标以添加新的共享文件夹
  4. 文件夹路径: x:
  5. 文件夹名称:/x
  6. 检查自动安装和永久性
  7. 重新启动虚拟机

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

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

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

我使用的绝对路径像这个 //C/workspace/nginx/nginx.conf和一切工作像一个魅力。
这个更新破坏了我的 docker-compose,我不得不将路径更改为 /C/workspace/nginx/nginx.conf,只有一个 /作为根目录。

注意,如果您试图从主机挂载一个卷,而这个卷还没有添加到 Docker Preferences 的 Resources > File Share 部分,那么这种情况也会发生。

enter image description here

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

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

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

我所做的:

  1. 在没有任何映射的情况下运行容器。

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

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

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

  4. 把地图放回去。

  5. 重新装上容器。

Docker Compose 将找到 .conf文件和 地图它,而不是尝试 创建一个目录

我在 Windows10上使用 Docker over WSL1时遇到了同样的问题:

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

从我使用的路径中去除似乎引起问题的 /mnt Bash 变量扩展 :

-v ${PWD/mnt\/}/conf/nginx.conf:/etc/nginx/nginx.conf

在我的案例中,这是一个问题与 Docker 的 Windows 和使用分区加密的比特洛克。如果在重新启动和解锁驱动器后,加密文件上有项目文件,Dokcer 就不能正确地查看项目文件。

你只需要重启 Docker

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

enter image description here

CleanWebpackPlugin可能是问题所在,在我的 Docker 文件中,我复制了如下文件:

COPY --chown=node:node dist/app.js /usr/app/app.js

然后在开发过程中,我通过 docker-compose 挂载该文件:

 volumes:
- ./dist/app.js:/usr/app/app.js

我会间歇性地得到 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.错误或它的某个版本。

问题是 CleanWebpackPlugin在重新构建 webpack 之前正在删除该文件。如果 Docker 试图在文件被删除时挂载文件,那么 Docker 就会失败。断断续续的。

要么完全删除 CleanWebpackPlugin,要么配置其选项使其更好地发挥作用。

当主机上的 json 文件具有可执行权限集时,就会发生这种情况。我不知道这背后的原因。