Windows(WSL2)下Docker Desktop数据卷挂载配置问题求助
我有一个在MacOS上可正常运行的Docker项目,但在Windows 11的WSL2环境下使用Docker Desktop(版本4.26.1,引擎版本24.0.7)无法启动。项目包含多个镜像及一个用于启动所有服务的Compose项目,均位于同一目录。
问题核心是docker-compose.yml中$PWD变量的使用导致挂载失败:默认会出现PWD variable is not set警告,最终报错:
Error response from daemon: failed to mount local volume: mount /docker-volumes/local-mongo-data:/var/lib/docker/volumes/composer_-local-mongo-data/_data, flags: 0x1000: no such file or directory
此前尝试的无效方法:
- 在
.env文件中定义PWD变量并设置为. - 将变量改为
${PWD}形式 - 将路径中的
/替换为\ - 移除变量,手动指定Windows格式路径如
E:\Projects\composer\docker-volumes、/E/Projects/composer/docker-volumes等 - 使用WSL路径前缀
\\wsl$\docker-desktop-data\data\docker\volumes
解决方案
1. 理解WSL2路径规则
Docker Desktop在WSL2环境下会将Windows磁盘挂载到WSL的/mnt/目录,比如Windows的E:\Projects\composer对应WSL内的/mnt/e/Projects/composer。docker-compose在WSL终端运行时,$PWD指向的是WSL内的当前工作目录,而非Windows路径。
2. 两种可行的配置方案
方案一:用相对路径替代$PWD(推荐)
直接将driver_opts中的device改为相对路径,让Docker自动解析Compose文件所在目录的绝对路径:
volumes: local-rabbit-data: driver_opts: type: none device: ./docker-volumes/local-rabbit-data o: bind local-mongo-data: driver_opts: type: none device: ./docker-volumes/local-mongo-data o: bind local-redis-data: driver_opts: type: none device: ./docker-volumes/local-redis-data o: bind
必须提前创建目录:确保docker-volumes及其子目录local-rabbit-data、local-mongo-data、local-redis-data已经手动创建,否则挂载会失败。
方案二:手动指定WSL格式绝对路径
如果需要用绝对路径,直接写入WSL内的路径格式:
volumes: local-rabbit-data: driver_opts: type: none device: /mnt/e/Projects/composer/docker-volumes/local-rabbit-data o: bind local-mongo-data: driver_opts: type: none device: /mnt/e/Projects/composer/docker-volumes/local-mongo-data o: bind local-redis-data: driver_opts: type: none device: /mnt/e/Projects/composer/docker-volumes/local-redis-data o: bind
3. 关键注意事项
- 必须在WSL终端(如Ubuntu/WSL2的bash/zsh)中执行
docker-compose up,不要使用Windows的CMD或PowerShell,避免路径解析错误。 - 检查Docker Desktop设置:确保
Settings > Resources > WSL Integration已启用当前使用的WSL发行版。 - 若之前创建过错误卷,先执行
docker-compose down -v删除旧卷,再重新启动服务。
内容的提问来源于stack exchange,提问作者Ismail Gül

