Управлять миграциями EF Core с помощью оркестровки контейнеров - PullRequest
3 голосов
/ 08 мая 2019

Я создаю ванильное веб-приложение с ASP.Net Core, Entity Framework Core и PostgreSQL, которое я хочу развернуть, используя оркестратор контейнера поверх Docker (будь то Docker Swarm или Kubernetes).

IМне интересно, как интегрировать мои миграции баз данных в процессе развертывания.

Мой текущий Dockerfile (я использую многоэтапную сборку):

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine as builder
COPY . /app
WORKDIR /app
RUN dotnet publish -c Release -o publish

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
COPY --from=builder /app/publish /app/
WORKDIR /app
CMD dotnet MyApp.dll

Мой docker-compose.yml (которыйЯ хочу использовать команду docker stack, поэтому она исключает использование опции build):

version: '3'

services:
    app:
        image: edouardberthe/myapp
        ports:
            - 80:80
        depends_on:
            - db
    db:
        image: postgres:latest
        ports:
            - 5432:5432
        volumes:
            - data:/var/lib/postgresql/data
        environment:
            POSTGRES_USER: myapp_user
            POSTGRES_PASSWORD: myapp_pass
            POSTGRES_DB: myapp_db
volumes:
    data:

Теперь я хочу запустить миграцию (сгенерированную ядром Entity Framework с помощью dotnet ef migrations add)на каждом развертывании.

В процессе разработки я использую dotnet ef database update.Однако я не могу этого сделать, потому что это означает, что мне понадобится .Net Core SDK во время выполнения (и, кроме того, я видел, что это считается плохой практикой из сообщений SO и документов Microsoft).

Я видел из это обсуждение на github о том, что лучше использовать dotnet ef migrations script --idempotent, который генерирует файл миграции с простым SQL во время сборки, а затем запускает этот скрипт во время выполнения.Но (как сказано в посте) «единственная проблема заключается в том, что мне также понадобится клиент командной строки для используемой базы данных в образе времени выполнения».

Если я буду следовать этому процессу, мой Dockerfile станет чем-то (оченьбольше и сложнее) как:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine as builder
COPY . /app
WORKDIR /app
RUN dotnet publish -c Release -o publish \
    && dotnet ef migrations script --output publish/migrate.sql --idempotent 

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
COPY --from=builder /app/publish /app/
WORKDIR /app
RUN apt-get update \
    && mkdir -p /usr/share/man/man1 \
    && mkdir -p /usr/share/man/man7 \
    && apt-get install --no-install-recommends -y postgresql-client \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean
CMD psql -f migrate.sql && dotnet MyApp.dll

(две mkdir строки из этого поста и это исправление ) Помимо большой сложности, которую он добавляетпоследняя строка CMD не работает, потому что у меня нет доступа к базе данных!Я знаю, каким будет имя, имя пользователя и пароль БД (даже если я не думаю, что это хорошая идея поместить его в Dockerfile), но я пока не знаю, что будет host.

Разве нет лучшего способа обработки миграций в такой конфигурации?

Спасибо

...