我很难让我的 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
这个文件给出了一个错误:
Error MSB4018 The "GetServiceReferences" task failed unexpectedly. Microsoft.Docker.Utilities.CommandLineClientException: yaml.scanner.ScannerError: while scanning a simple key in "C:\Projects\MyProject\MyApp\docker-compose.yml", line 16, column 7 could not find expected ':'
我在这里做错了什么?谁能帮我更正这两个文件,以便新创建的行在重新启动计算机后仍然存在?
非常感谢!
最佳答案
这不是真正的答案,但对于评论来说太长了,所以......
mssql docker容器有两个版本:windows和Linux。您使用的是 Windows 容器,而 Linux 容器更为常见。这就是为什么 Internet 中的许多示例无法按预期工作的原因。
- https://hub.docker.com/r/microsoft/mssql-server-windows-developer/ ( window )
- https://hub.docker.com/r/microsoft/mssql-server-linux/ (Linux)
在您的第一个示例中,您似乎使用的是 mssql 用于 Linux 的路径(/var/opt 是典型的 Linux 路径)。所以 1) 找到容器内用于存储数据库数据的路径。
您的第二个示例根本就没有有效的 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
如果您使用单独的“volumes”部分指定命名卷,则语法为 name:path_inside_container。
还有一点要注意:我会选择 Linux 容器。您会在 docker for windows 菜单(托盘图标)中找到一个菜单项“切换到 Linux 容器...”。如果禁用,您可能必须从 Microsoft 商店安装 Linux(只需搜索 ubuntu)。
关于Docker for windows sql express 卷数据不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53133138/