Windows 10下Docker Compose挂载mssqldb卷未生成MDF/LDF文件求助
自定义绑定卷挂载失败的修复方案
核心根因
你当前的配置存在三处关键错误,导致容器运行无报错但数据未落到宿主机指定路径:
- 创建外部绑定卷时的Windows路径格式不符合Linux容器的识别规则,Docker未成功绑定到你桌面的db文件夹,转而在WSL2虚拟磁盘内创建了普通本地卷,自然不会在宿主机路径下生成文件。
- 错误将
COMPOSE_CONVERT_WINDOWS_PATHS=1作为容器环境变量传入,这个参数是Docker Compose的顶层解析配置,不是容器内部可识别的运行时变量,传入后完全不生效。 - 服务内的挂载目标路径与SQL Server 2017 Linux容器的默认数据目录完全不匹配,SQL Server不会向非默认目录写入数据库文件。
分步修复操作
- 清理之前创建的无效卷
执行命令删除路径不匹配的旧卷:docker volume rm mssqldb - 用正确路径格式重新创建绑定卷
Linux容器场景下,Docker识别Windows宿主机路径需要使用无反斜杠的正向斜杠格式,不要用原生Windows路径写法:docker volume create --driver local --opt type=none --opt device=/c/Users/Kishan/Desktop/db --opt o=bind mssqldb - 修正docker-compose.yml配置
调整两处错误配置:将Windows路径转换参数移到Compose顶层、修正SQL Server的挂载目标路径为默认数据目录,修正后的完整配置参考:# Windows路径转换参数为顶层配置,不要放到服务的environment里 COMPOSE_CONVERT_WINDOWS_PATHS: 1 version: '3.8' services: db: image: mcr.microsoft.com/mssql/server:2017-latest # 修正挂载路径为SQL Server默认的数据根目录 volumes: - mssqldb:/var/opt/mssql environment: - ACCEPT_EULA=Y - SA_PASSWORD=yourStrong@Password restart: always ports: - "1433:1433" api: depends_on: - db entrypoint: ["./wait_for.sh", "db:1433", "-t", "3600", "--", "execute", "api"] image: api:latest ports: - "80:80" restart: always volumes: mssqldb: external: true
验证方法
配置生效后重启服务,可通过两个方式确认挂载成功:
- 执行
docker inspect <db容器名称>,查看Mounts字段下的Source值,确认对应路径为/c/Users/Kishan/Desktop/db - 进入容器执行
ls /var/opt/mssql,能看到data、log、mssql.conf等目录文件时,说明SQL Server已正常写入数据,对应文件会同步出现在你桌面的db文件夹内。
提示:如果不想单独创建外部命名卷,也可以直接用bind挂载的短格式写配置,减少路径格式出错的概率,对应配置为
volumes: - /c/Users/Kishan/Desktop/db:/var/opt/mssql,此时不需要在顶层声明外部卷。
内容的提问来源于stack exchange,提问作者Kishan
相关产品推荐
相关产品推荐

