Как изменить пользовательскую точку входа в файле Docker, чтобы применить миграции к sqlserver перед запуском основного веб-приложения ASP.NET? - PullRequest
0 голосов
/ 11 апреля 2019

Это проект веб-приложения VSTudio 2017 ASP.NET Core с SQL Server 2017 для Linux, использующий Docker-compose. Докер-файл:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY CoreWebApp/CoreWebApp.csproj CoreWebApp/
RUN dotnet restore CoreWebApp/CoreWebApp.csproj
COPY . .
WORKDIR /src/CoreWebApp
RUN dotnet build CoreWebApp.csproj -c Release -o /app

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
#ENTRYPOINT ["dotnet", "CoreWebApp.dll"]

и docker-compose.yml:

version: '3.4'

services:
  sql.data:
    image: microsoft/mssql-server-linux:2017-latest
    environment:
      - SA_PASSWORD=Sql_Admin1
      - ACCEPT_EULA=Y
    ports:
      - "5434:1433"
    container_name: sqlserverlnx-2017

  corewebapp:
    image: corewebapp:dev
    build:
      context: .
      dockerfile: CoreWebApp/Dockerfile
    container_name: corewebapp
    depends_on:
      - sql.data

Я хочу применить миграцию к базе данных до запуска приложения. На основании setp 4 этого руководства в Докер Составьте документацию Я заменил строку ENTRYPOINT моего Dockerfile следующим:

#ENTRYPOINT ["dotnet", "CoreWebApp.dll"]
RUN chmod +x ./entrypoint.sh 
CMD /bin/bash ./entrypoint.sh

И создал файл entrypoint.sh так:

#!/bin/bash 

set -e 
run_cmd="dotnet CoreWebApp.dll" 

until dotnet ef database update; do 
>&2 echo "SQL Server is starting up" 
sleep 1 
done 

>&2 echo "SQL Server is up - executing command" 
exec $run_cmd

Но миграция не применяется. Я вижу вывод сборки, что entrypoing.sh выполняется без ошибок, как в следующем хвосте журнала:

##... previous log steps removed for simplicity
2>**Step 18/18 : CMD /bin/bash ./entrypoint.sh**
2> ---> Running in 2dbecae7cd43
2>Removing intermediate container 2dbecae7cd43
2> ---> 878096c73494
2>Successfully built 878096c73494
2>Successfully tagged corewebapp:dev
2>docker-compose  -f "G:\Dockerizing ASPNet Core\CoreWebApp\docker-compose.yml" -f "G:\Dockerizing ASPNet Core\CoreWebApp\docker-compose.override.yml" -f "G:\Dockerizing ASPNet Core\CoreWebApp\obj\Docker\docker-compose.vs.release.g.yml" -p dockercompose7669752967822022310 --no-ansi up -d --no-build
2>sqlserverlnx-2017 is up-to-date
2>Recreating corewebapp ...
2>Recreating corewebapp ... done

[Edit:] Я вошел в контейнер через консоль PowerShell и обнаружил некоторые проблемы: 1. Кодовая страница entrypoint.sh не была в стиле Unix. Исправлена. 2. Полученное изображение не включает dotnet SDK, после чего оно выходит из строя:

until dotnet ef database update; do

со следующей ошибкой:

Вы имели в виду запускать команды dotnet SDK? Пожалуйста, установите dotnet SDK из: https://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

Я заменил окончательное изображение на последнем этапе в Dockerfile, чтобы использовать "build" вместо "base" следующим образом:

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

и, безусловно, dotnet SDK включен в окончательное изображение, но это не решает проблему. Запуск вручную при миграции теперь приводит к следующей ошибке: "Проект не найден. Измените текущий рабочий каталог или используйте параметр --project"

1 Ответ

0 голосов
/ 12 апреля 2019

Для dockerfile без RUN chmod +x ./entrypoint.sh, советую попробовать как

WORKDIR /src/CoreWebApp
RUN dotnet build CoreWebApp.csproj -c Release -o /app
Run dotnet ef database update
...