Создать ASP.NET Основной серверный контейнер веб-API, включающий восстановленную базу данных для интерфейса

#sql-server #docker #.net-core #docker-compose #containers

Вопрос:

Мне нужно создать контейнер Docker API с базой данных SQL Server 2017. С этой частью нет никаких проблем. Моя проблема в том, что я хотел бы восстановить .bak файл внутри контейнера docker, чтобы разработчику интерфейса нужно было только выполнить настройку docker, чтобы запустить весь сервер, включая базу данных с тестовыми данными.

Любая помощь будет признательна 😉

Мой файл Docker-Compse

 version: '3.4'

services:
  api:
    image: ${DOCKER_REGISTRY-}api
    build:
      context: .
      dockerfile: Api/Dockerfile
    depends_on:
            - db
  db:
    image: "mcr.microsoft.com/mssql/server:2017-latest"
    ports:
        - "1433:1433"
    volumes:
        - "sqlvolume:/var/opt/mssql"
    restart: always
    environment:
        SA_PASSWORD: "<password>"
        ACCEPT_EULA: "Y"
 

И мой док-файл

 FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["Api/Api.csproj", "Api/"]
RUN dotnet restore "Api/Api.csproj"
COPY . .
WORKDIR "/src/Api"
RUN dotnet build "Api.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Api.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

ENTRYPOINT ["dotnet", "Api.dll"]
 

Ответ №1:

Из документов для восстановления базы данных в контейнере необходимо создать каталог резервной копии и скопировать в него файл резервной копии. Оттуда вы можете запустить команду восстановления.

Вы можете выполнить эти действия также в своем файле Dockerfile

 FROM mcr.microsoft.com/mssql/server:2019-latest

RUN mkdir /var/opt/mssql/backup
COPY yourbackup.bak /var/opt/mssql/backup/.
COPY entrypoint.sh .
COPY run-initialization.sh .

ENV SA_PASSWORD yourpassword
ENV ACCEPT_EULA Y

CMD /bin/bash ./entrypoint.sh

 

Это entrypoint.sh может выглядеть примерно так:

 /usr/src/app/run-initialization.sh amp; /opt/mssql/bin/sqlservr
 

Сценарий инициализации выполняется в фоновом режиме и одновременно с запуском sql server.

Это run-initialization.sh может выглядеть примерно так:

 # Wait to be sure that SQL Server came up
sleep 90s

# Run the restore script to create the DB with schema amp; data
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'yoursapassword' -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/yourbackup.bak"'