适用于Windows sql的Docker Express卷数据不持久

时间:2018-11-03 16:12:39

标签: 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创建和更新数据库。

我觉得问题可能与Windows的Docker具有通常的路径语法有关,但这只是预感。

我尝试了很多不同的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列找不到预期的':'

我在这里做错了什么?谁能帮助我更正这两个文件,以便重新启动计算机后新创建的行仍然存在?

非常感谢!

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

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

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

在第一个示例中,您似乎正在使用mssql用于Linux的路径(/ var / opt是典型的Linux路径)。所以1)找到容器内部用于存储db数据的路径。

您的第二个示例就是没有有效的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

如果您使用单独的“卷”部分指定命名卷,则语法为name:path_inside_container。

另一个注意事项:我将使用Linux容器。您将在docker中找到用于Windows菜单的菜单项“切换到Linux容器...”(托盘图标)。如果禁用此功能,则可能必须从Microsoft商店安装Linux(只需搜索ubuntu)。