Я создаю ванильное веб-приложение с 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
.
Разве нет лучшего способа обработки миграций в такой конфигурации?
Спасибо