【问题标题】:Docker for windows sql express volume data does not persistDocker for windows sql express 卷数据不持久
【发布时间】:2019-04-07 13:23:32
【问题描述】:

我无法让我的 mssql-server-windows-express 容器化数据库在重新启动计算机后保留任何已创建的行。

它位于我使用 Visual Studio 2017 社区版的默认“启用 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 asp.net-core docker-compose asp.net-core-2.1 docker-for-windows


    【解决方案1】:

    这不是一个真正的答案,但评论太长了,所以...

    mssql docker 容器有两个版本:windows 和 Linux。您使用的是 Windows 容器,而 Linux 容器更常见。这就是为什么 Internet 中的许多示例无法按预期工作的原因。

    在您的第一个示例中,您似乎使用的是 mssql for 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)。

    【讨论】:

    • 非常感谢您的回复。您的答案中有很多好东西。我会尝试更多你的建议。目前,我已经尝试过您的建议,将路径替换为 sql 用于存储数据的目录。我收到以下错误。该错误并不意味着路径错误。 :错误:对于 dockercompose6946136170613312467_db_1 无法启动服务数据库:容器 8ae036848a1752c91802dae1c2f8e2613782ac5634963afa48931a9158f6889c 在启动期间遇到错误:Windows 系统调用失败:计算系统意外退出。 (0xc0370106)
    • 我现在使用的路径是:volumes: - "C:\\ProgramData\\Docker\\volumes\\dockercompose6946136170613312467_sqlvolume:C:\\Program Files/Microsoft SQL Server/MSSQL14.SQLEXPRESS/MSSQL/DATA"
    • 抱歉,我使用的是 Linux 的 SQL Server,所以我对 windows 版本的错误没有经验。你检查过 docker logs CONTAINERNAME 吗? (如果不知道容器名称,可以用 docker ps 获取列表)。
    • 对于其他任何人:(0xc0370106) 可以通过首先使用空白文件夹创建 docker 映像,然后在主机的文件夹中创建文件来解决该错误,正如 christianacca 在此 github 帖子中提到的那样:link
    • Christoph,非常感谢您对我的卷声明的语法和路径的帮助。您的建议极大地帮助了我解决问题。
    【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多