Windows运行Linux容器时Docker Volume挂载MSSQL数据不持久化问题问询
问题根因
你配置的挂载路径完全错误,mssql Linux版的默认数据存储路径不是/data,而是/var/opt/mssql,你的挂载操作没有触及到真正存储数据的目录,所以删除容器后数据自然会丢失。
你之前的配置存在三个明显错误:
- 首次配置时,你将本地
./data目录挂载到了容器内无关的/data路径,mssql不会往该路径写入任何业务数据 - 后续调整配置时,你搞错了卷挂载的语法规则:卷挂载格式为
[宿主机资源/卷名]:[容器内目标路径],你填写的/var/lib/docker/volumes/sssvolume/_data是宿主机上卷的物理存储路径,完全不应该出现在冒号右侧的容器路径位置 - 你在yaml底部定义的命名卷
sssvolume从未被实际使用,服务配置里的挂载项和该命名卷没有关联
正确配置示例
场景1:使用本地绑定挂载持久化(适合开发环境,数据直接存在当前项目的data目录下)
version: '3' services: api: image: myimage/myimagename:myimagetag environment: - SQL_CONNECTION=myserverconnection ports: - 44384:80 depends_on: - mydatabase mydatabase: image: mcr.microsoft.com/mssql/server:2019-latest environment: - ACCEPT_EULA=Y - SA_PASSWORD=mypassword volumes: # 把容器内mssql的实际数据目录映射到本地./data路径 - ./data:/var/opt/mssql ports: - 1433:1433
场景2:使用Docker命名卷持久化(适合生产环境,由Docker统一管理卷存储,规避Windows路径权限问题)
version: '3' services: api: image: myimage/myimagename:myimagetag environment: - SQL_CONNECTION=myserverconnection ports: - 44384:80 depends_on: - mydatabase mydatabase: image: mcr.microsoft.com/mssql/server:2019-latest environment: - ACCEPT_EULA=Y - SA_PASSWORD=mypassword volumes: # 直接关联定义好的命名卷到容器内数据目录 - sssvolume:/var/opt/mssql ports: - 1433:1433 volumes: sssvolume: # 只有提前手动执行docker volume create sssvolume创建的外部卷才需要加下面这行 # external: true
注意事项
- Windows环境使用WSL2后端的Docker Desktop时,本地绑定挂载可能出现权限异常导致mssql启动失败,优先使用命名卷方案
- 调整配置后首次启动前,要先删除之前挂载到错误路径产生的无效本地data目录或者无效卷内容,避免残留文件影响
内容的提问来源于stack exchange,提问作者ygetarts
相关产品推荐
相关产品推荐

