Docker for windows sql 快递卷数据不持久
Docker for windows sql express volume data does not persist
我很难让我的 mssql-server-windows-express 容器化数据库在重新启动计算机后保留所有创建的行。
它位于我使用 Visual Studio 2017 Community Edition 的默认 "Enable Docker Support" 复选框创建的项目中。我正在使用 Entity Framework Core 2 迁移来使用 ASP.NET Core 2.1.
创建和更新数据库
我觉得问题可能与 Docker 有关,因为 Windows 具有通常的路径语法,但这只是一种预感。
我尝试了很多不同的 Whosebug 和博客建议和路径,但数据永远不会保留。这个时候只好求助了
以下是我尝试过的许多 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 容器更常见。这就是为什么网上很多例子都不能按预期运行的原因。
- https://hub.docker.com/r/microsoft/mssql-server-windows-developer/ (windows)
- 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 个容器。您会在 windows 菜单(托盘图标)的 [=50=] 中找到一个菜单项 "Switch to Linux containers..."。如果此功能被禁用,您可能必须从 Microsoft 商店安装 Linux(只需搜索 ubuntu)。
最终让我在系统重启后持久化数据的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-server-windows-express 容器化数据库在重新启动计算机后保留所有创建的行。
它位于我使用 Visual Studio 2017 Community Edition 的默认 "Enable Docker Support" 复选框创建的项目中。我正在使用 Entity Framework Core 2 迁移来使用 ASP.NET Core 2.1.
创建和更新数据库我觉得问题可能与 Docker 有关,因为 Windows 具有通常的路径语法,但这只是一种预感。
我尝试了很多不同的 Whosebug 和博客建议和路径,但数据永远不会保留。这个时候只好求助了
以下是我尝试过的许多 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 容器更常见。这就是为什么网上很多例子都不能按预期运行的原因。
- https://hub.docker.com/r/microsoft/mssql-server-windows-developer/ (windows)
- 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 个容器。您会在 windows 菜单(托盘图标)的 [=50=] 中找到一个菜单项 "Switch to Linux containers..."。如果此功能被禁用,您可能必须从 Microsoft 商店安装 Linux(只需搜索 ubuntu)。
最终让我在系统重启后持久化数据的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"