【问题标题】:Are you trying to mount a directory onto a file (or vice-versa)?您是否尝试将目录挂载到文件上(反之亦然)?
【发布时间】:2018-02-08 21:35:49
【问题描述】:

我有一个版本为 17.06.0-ce 的 docker。当我尝试使用带有命令的 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/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0/etc/nginx/nginx.conf\\" 导致\\"不是目录\\"\"" :您是否尝试将目录挂载到文件上(反之亦然)?检查指定的主机路径是否存在并且是预期的类型。

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

【问题讨论】:

  • ls -al . 的输出是什么?想看看你的密码是什么样子的。
  • 在我的情况下,我不小心将主机中的目录映射到容器中的文件。重新启动容器不再起作用。我不得不删除容器 (docker rm …),然后重新创建它。

标签: docker nginx


【解决方案1】:

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

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

docker rm -v <container_name>

问题:

如果您之前尝试运行 docker run 命令,而 文件 不存在于它应该在主机目录中的位置,则可能会出现您面临的错误。

在这种情况下,docker daemon 会在容器内创建一个 目录,当正确的文件放入主机目录和 docker 命令时,该目录无法映射到正确的文件再次运行。

解决方案:

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

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

【讨论】:

  • 原始问题中的命令仅列出正在使用的主机卷。 docker volume 命令/接口仅适用于匿名和命名卷,它们不是原始问题的一部分。
  • @programmerq 看看报错,说挂载在/var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\"时挂载失败我的推论:由于之前的运行,它已经有一个文件夹,所以如果你尝试映射一个文件到该文件夹​​,它会失败。
  • 这里有两件事可能出错了,要么是主机出错,要么已经创建的卷有不正确的东西。假设主机是正确的,我认为最好清除现有卷的问题。
  • 当容器已经与一个卷关联并且该卷的类型在下次运行中被更改时,这实际上是一个有效的答案。所以删除音量可能会有所帮助!
  • 这很有帮助。我的问题确实是我仍然定义了旧容器。使用 docker rm 删除它们,然后进行 docker-compose up 工作正常。
【解决方案2】:

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

测试

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

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

【讨论】:

  • 作为中级 Linux 用户我很好奇,Linux 将其识别为文件夹而不是文件的原因是什么?
  • 因为它实际上是一个文件夹。如果文件不存在,docker会因为volume参数创建一个文件夹-v
  • 好的,所以如果 docker 由于路径以前不存在而必须创建它,Linux 只会将其识别为文件夹;但是如果nginx.conf 之前已经存在于该路径中,Linux 会将其识别为文件,对吧?
【解决方案3】:

不应再发生这种情况(自 v2.2.0.0 起),请参阅 here


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

如何解决:

  1. 首先确保删除损坏的容器的卷
    docker rm -v &lt;container_name&gt;
    更新:以下步骤无需先删除卷即可工作。
  2. 打开 Docker 设置
  3. 转到“共享驱动器”标签
  4. 点击窗口底部的“重置凭据...”链接
  5. 重新共享要与 Docker 一起使用的驱动器
  • 系统会提示您输入用户名/密码
  1. 点击“应用”
  2. 转到“重置”标签
  3. 点击“重启Docker”
  4. 重新创建您的容器/卷

Credit goes to BaranOrnarli on GitHub for the solution.

【讨论】:

  • 谢谢!它适用于我从第二步开始并避免最后一步。
  • 我能够通过从第 2 步开始并省略最后一个来解决问题。我不必销毁容器/卷即可再次挂载。
  • 我同意@MateoHermosilla,它不需要检测容器,只需“重置凭据”
  • 在安装沙盒代理 (hadoop) 时尝试运行 proxy-deploy.sh 时遇到同样的错误。按照这个解决方案。没修好。
  • 这对我来说是个问题。密码重置是每隔几个月,所以我总是忘记在 Docker 中重置共享驱动器凭据。
【解决方案4】:

您能否使用绝对/完整路径代替$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 它应该没有什么区别外壳会在将其传递给 docker run 之前对其进行翻译,实际上,它并没有什么不同,至少对我而言
【解决方案5】:

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

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

【讨论】:

  • 我安装的文件夹是 C:\x-suite\ ;我共享了我的C盘,但仍然没有解决我的问题
  • 你在使用 Docker ToolBox 吗?
  • minikube+virtualBox+docker ToolBox , localkube 已弃用,我应该使用什么驱动程序?
  • 如果你从 Dockercompose 挂载,那么使用 ${pwd}/
  • 如果你在 Dockerfile 中做,那么使用 VOLUME /c/x-suite
【解决方案6】:

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

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

容器在C:\Users\ 有一个默认同步目录,所以我将我的项目移动到C:\Users\,然后重新创建了项目。现在可以了。

【讨论】:

    【解决方案7】:

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

    就像这个惊人的指南中建议的那样:Setting Up Docker for Windows and WSL to Work Flawlessly,现在一切正常。

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

    【讨论】:

    【解决方案8】:

    将 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 后,所有命令都运行良好 ?

    【讨论】:

      【解决方案9】:

      因为我在本地没有该文件,所以我将其创建为文件夹。

      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/
      

      【讨论】:

        【解决方案10】:

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

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

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

        【讨论】:

          【解决方案11】:

          对我来说,这不起作用:

          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
          

          【讨论】:

            【解决方案12】:

            我将在这里分享我的案例,因为这可能会为将来的其他人节省大量时间。

            在我开始在 Gitlab CI 中使用 docker-in-docker 之前,我在我的 macos 上有一个完美运行的 docker-compose。我只被授予在存储库中作为 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
            

            这解决了问题!

            【讨论】:

              【解决方案13】:

              为使用 Docker 工具箱

              的人提供答案

              这里至少有 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,右键单击默认(来自 Docker 的 VM)> 设置 > 共享文件夹

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

              1. 上面将在VM中将C:\projects映射到/projectsROOT/projects),这意味着现在您可以引用项目中的任何路径,如下所示:/projects/project_name - 因为来自C:\projects\project_nameproject_name现在是已安装。

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

              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 的位置

              【讨论】:

                【解决方案14】:

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

                ./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 设置相当复杂!
                【解决方案15】:

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

                $ docker container prune
                $ docker volume prune
                

                【讨论】:

                  【解决方案16】:

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

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

                  从 VPN 断开后问题消失。

                  所以我建议在运行 Docker Desktop 时检查你的防火墙,不要使用代理或 VPN。

                  查看Docker for windows - Firewall rules for shared drives了解更多详情。

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

                  【讨论】:

                    【解决方案17】:

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

                    这是我解决问题的方法:

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

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

                    【讨论】:

                      【解决方案18】:

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

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

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

                      【讨论】:

                        【解决方案19】:

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

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

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

                        【讨论】:

                          【解决方案20】:

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

                          我做了什么:

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

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

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

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

                          4. 放回映射。

                          5. 重新挂载容器。

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

                          【讨论】:

                            【解决方案21】:

                            我在 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
                            

                            从我使用的路径中去除似乎会导致问题的/mnt bash variable extension:

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

                            【讨论】:

                            • 您是否注意到使用 Windows 样式路径与 Unix 样式路径时的性能差异?
                            • 我不知道。我只是使用 Docker for Windows 进行测试/开发,从未监控过性能。
                            【解决方案22】:

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

                            您只需重启 Docker

                            【讨论】:

                              【解决方案23】:

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

                              【讨论】:

                              • 谢谢这解决了我的问题。我还在实验功能部分关闭了使用 Docker Compose v2。
                              • 这在 Apple 硅 mac 上不起作用,可能会导致 Docker 卡在启动守护进程。
                              【解决方案24】:

                              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,要么配置其选项以更好地发挥作用。

                              【讨论】:

                                猜你喜欢
                                • 2019-04-19
                                • 2023-01-03
                                • 1970-01-01
                                • 1970-01-01
                                • 2021-02-17
                                • 2022-06-28
                                • 1970-01-01
                                • 2011-04-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多