Докер для windows sql express данные тома не сохраняются - PullRequest
0 голосов
/ 03 ноября 2018

У меня возникают проблемы с получением моей контейнерной базы данных mssql-server-windows-express для сохранения любых созданных строк после перезагрузки компьютера.

Он находится в проекте, который я создал с помощью флажка «Включить поддержку Docker» по умолчанию в Visual Studio 2017 Community Edition. Я использую миграции Entity Framework Core 2 для создания и обновления базы данных с ASP.NET Core 2.1.

Мне кажется, что проблема может быть связана с Docker для 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 не может найти ожидаемый ':'

Что я здесь не так делаю? Может ли кто-нибудь помочь мне исправить любой файл, чтобы вновь созданные строки сохранялись после перезагрузки компьютера?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Файл 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"
0 голосов
/ 03 ноября 2018

Это не настоящий ответ, но слишком длинный для комментария, так что ...

Существует две версии контейнера mssql: 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 vars следующим образом:

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. Вы найдете пункт меню «Переключиться на контейнеры Linux ...» в вашем Docker для меню Windows (значок в трее) Если это отключено, вам, возможно, придется установить Linux из магазина Microsoft (просто найдите ubuntu).

...