[英]Docker for windows sql express volume data does not persist
我很难让我的mssql-server-windows-express容器化数据库在重新启动计算机后保留任何创建的行。
它驻留在我使用Visual Studio 2017 Community Edition的默认“启用Docker支持”复选框创建的项目中。 我正在使用Entity Framework Core 2迁移来使用ASP.NET Core 2.1创建和更新数据库。
我觉得问题可能与Docker for Windows具有通常的路径语法有关,但这只是一种预感。
我尝试了很多不同的Stackoverflow和博客建议和路径,但数据永远不会存在。 我现在必须要求帮助。
以下是我尝试过的众多docker-compose文件和想法中的两个:
version: '3.4'
services:
webpresentation:
image: webpresentation
build:
context: .
dockerfile: WebPresentation\Dockerfile
db:
image: microsoft/mssql-server-windows-express
environment:
ACCEPT_EULA: Y
SA_PASSWORD: Test1
ports:
- "1433:1433"
volumes:
- "C:\\ProgramData\\Docker\\volumes\\dockercompose4363425345347741_sqlvolume:c:\\var/opt/mssql"
volumes:
sqlvolume:
此文件编译,但重新启动后行不会保留。
version: '3.4'
services:
webpresentation:
image: webpresentation
build:
context: .
dockerfile: WebPresentation\Dockerfile
db:
image: microsoft/mssql-server-windows-express
container_name: myDbSqlExpress
environment:
ACCEPT_EULA: Y
SA_PASSWORD: Test1
'attach_dbs={"dbName":"MyDb","dbFiles":"C:\\ContainerData\\MyDb.mdf","C:\\ContainerData\\MyDb.ldf"}'
ports:
- "1433:1433"
volumes:
- "C:\\DockerData:c:\\ContainerData"
volumes:
sqlvolume:
name: myDb-sqlvolume
该文件出错:
错误MSB4018“GetServiceReferences”任务意外失败。 Microsoft.Docker.Utilities.CommandLineClientException:yaml.scanner.ScannerError:在“C:\\ Projects \\ MyProject \\ MyApp \\ docker-compose.yml”中扫描一个简单的键时,第16行,第7列找不到预期的':'
我在这做错了什么? 任何人都可以帮我纠正任何一个文件,以便重新启动计算机后新创建的行仍然存在吗?
非常感谢!
最终允许我在系统重启后保留数据的docker-compose.yml文件如下:
version: '3.4'
services:
webpresentation:
image: webpresentation
build:
context: .
dockerfile: WebPresentation\Dockerfile
db:
image: microsoft/mssql-server-windows-express
environment:
ACCEPT_EULA: Y
SA_PASSWORD: Test1
attach_dbs: '[{"dbName":"MyProject","dbFiles":["C:\\DockerDbData\\MyProject.mdf","C:\\DockerDbData\\MyProject_log.ldf"]}]'
ports:
- "1433:1433"
volumes:
- "C:\\Projects\\MyProject\\DockerDbDataVolume:C:\\DockerDbData"
这不是一个真正的答案,但评论太长,所以...
mssql docker容器有两个版本:windows和Linux。 您正在使用Windows容器,而Linux容器更常见。 这就是为什么互联网上的许多例子不能按预期工作的原因。
在您的第一个示例中,您似乎正在使用mssql for Linux使用的路径(/ var / opt是典型的Linux路径)。 因此1)找到容器内用于存储db数据的路径。
你的第二个例子就是没有效的yaml。 语法是key:value,因此您的attach_db行无效。
来自docs:
ENV attach_dbs='[{"dbName":"mydb","dbFiles":["C:\\temp\\mydb.mdf","C:\\temp\\mydb.ldf"]}]'
在这里,我们看到它是一个环境变量。 你设置这样的env vars:
env:
attach_dbs: '[{"dbName":"mydb","dbFiles":["C:\\temp\\mydb.mdf","C:\\temp\\mydb.ldf"]}]'
这应该可以解决您的解析错误。
你应该在这里阅读有关卷的内容: https : //docs.docker.com/compose/compose-file/#volumes
如果指定具有单独“卷”部分的命名卷,则语法为name:path_inside_container。
还有一点需要注意:我会使用Linux容器。 您可以在Docker中找到一个菜单项“切换到Linux容器...”(Windows菜单)(托盘图标)。 如果禁用此功能,则可能必须从Microsoft商店安装Linux(只需搜索ubuntu)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.