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 容器更常见。这就是为什么网上很多例子都不能按预期运行的原因。

在您的第一个示例中,您似乎正在使用 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"