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中,如果该目录未正确共享)并将该目录安装在容器中。如果它应该是一个文件而不是容器内的一个目录,你会得到一个错误。
我正在 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中,如果该目录未正确共享)并将该目录安装在容器中。如果它应该是一个文件而不是容器内的一个目录,你会得到一个错误。