重新启动计算机后,我很难使mssql-server-windows-express容器化数据库保留所有创建的行。
它驻留在我使用Visual Studio 2017 Community Edition的默认“启用Docker支持”复选框创建的项目中。我正在使用Entity Framework Core 2迁移来使用ASP.NET Core 2.1创建和更新数据库。
我觉得问题可能与Windows的Docker具有通常的路径语法有关,但这只是预感。
我尝试了很多不同的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列找不到预期的':'
我在这里做错了什么?谁能帮助我更正这两个文件,以便重新启动计算机后新创建的行仍然存在?
非常感谢!
答案 0 :(得分:2)
最终使我在系统重启后保留数据的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"
答案 1 :(得分:1)
这不是一个真实的答案,但是评论太久了,所以...
mssql docker容器有两种版本:Windows和Linux。您正在使用Windows容器,而Linux容器更为常见。这就是为什么Internet中的许多示例无法按预期工作的原因。
在第一个示例中,您似乎正在使用mssql用于Linux的路径(/ var / opt是典型的Linux路径)。所以1)找到容器内部用于存储db数据的路径。
您的第二个示例就是没有有效的Yaml。语法为key:value,因此您的attach_db行无效。
来自文档:
ENV attach_dbs='[{"dbName":"mydb","dbFiles":["C:\\temp\\mydb.mdf","C:\\temp\\mydb.ldf"]}]'
在这里,我们看到它是一个环境变量。您可以这样设置环境变量:
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中找到用于Windows菜单的菜单项“切换到Linux容器...”(托盘图标)。如果禁用此功能,则可能必须从Microsoft商店安装Linux(只需搜索ubuntu)。