Docker 容器尝试挂载一个目录,该目录是一个文件

Docker container tries to mount a directory that is a file

我正在 docker 中构建 craft cms,当我执行 docker-compose up:

时出现以下错误

ERROR: for craftcms Cannot start service craftcms: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:424: container init caused \"rootfs_linux.go:58: mounting \"/host_mnt/c/src/composer.lock\" to rootfs \"/var/lib/docker/overlay2/b7084475699f911f17d38746b21b1b9694fedf6e096a4080109d429fa687a6db/merged\" at \"/var/lib/docker/overlay2/b7084475699f911f17d38746b21b1b9694fedf6e096a4080109d429fa687a6db/merged/var/www/composer.lock\" 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 ERROR: Encountered errors while bringing up the project.

显然,Windows OS 中的挂载目录与 Linux OS 中的挂载目录不同。你能帮我解决这个问题吗?

更新

从 docker-compose.yml,这是我挂载文件的地方:

craftcms:
    build:
      context: .
      dockerfile: ./infrastructure/docker/php-fpm/Dockerfile
    expose:
      - 9000
    volumes:
      - cpresources:/var/www/web/cpresources
      - ./src/vendor:/var/www/vendor
      - ./src/composer.json:/var/www/composer.json
      - ./src/composer.lock:/var/www/composer.lock
      - ./src/config:/var/www/config
      - ./src/modules:/var/www/modules
      - ./src/templates:/var/www/templates
      - ./src/web:/var/www/web

这通常表示 src/composer.lock 不是文件,或者这些文件所在的驱动器未正确共享到 docker VM。

对于前者,请检查您所在的目录 运行 docker-compose,这是经过审查的目录,因此我无法为您提供比这更详细的信息。你应该在那里有一个 src\composer.lock 作为常规文件,而不是目录。

对于后者,进入 docker 首选项,并重新配置驱动器共享以确保包含您的 compose 项目的驱动器,并且 docker 有您的当前密码(它执行windows SMB 挂载以将驱动器共享到 docker VM)。

当docker尝试挂载一个不存在的文件作为主机挂载时,默认操作是在主机上创建一个目录(这可能只在docker VM中,如果该目录未正确共享)并将该目录安装在容器中。如果它应该是一个文件而不是容器内的一个目录,你会得到一个错误。