Docker for windows sql express 卷数据不持久

标签 docker asp.net-core docker-compose asp.net-core-2.1 docker-for-windows

我很难让我的 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 中的许多示例无法按预期工作的原因。

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

相关文章:

docker - AM572x-使用docker访问A15和M4之间的IPC

docker -/bin/bash:脚本/script.sh:权限被拒绝

c++ - Visual Studio 2017 .Net Core 2.0 Angular 发布失败

image - 使用docker镜像存储数据文件

docker - Jenkins管道异常-找不到docker

docker - 使用 docker image testcafe/testcafe 时没有创建截图目录的权限

asp.net-core - 在 JWT token 中传递租户 ID 是一个好习惯吗?

c# - 使用 ViewBag 中的列表选择 TagHelper

docker - 错误 : Pool overlaps with other one on this address space when starting my_project docker setup

docker - 如何使应用程序属性从docker-compose文件中的环境变量中选取