Задать вопрос
@savva09
Начинающий .NET-ер

Как создавать и применять миграции в docker?

У меня приложение, запускается в docker-compose. Вся конфигурация бд прописана в .env. Раньше для создания мигарций просто писал dotnet ef migrations add MyMigration, а тут что-то сломалось и любые обращения к dotnet ef выглядят так:
PS C:\Users\User\Source\Repos\EndowmentFund\Server> dotnet ef migrations list
Build started...
Build succeeded.
An error occurred while accessing the Microsoft.Extensions.Hosting services. Continuing without the application service provider. Error: Value cannot be null. (Parameter 's')
Unable to create a 'DbContext' of type 'RuntimeType'. The exception 'Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[Server.Storage.Db.AppDbContext]' while attempting to activate 'Server.Storage.Db.AppDbContext'.' was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728


Контекст бд вполне обычный:
public class AppDbContext(DbContextOptions<AppDbContext> options) : IdentityDbContext(options)
{
    public DbSet<Event> Events { get; set; }
    public DbSet<Donation> Donations { get; set; }
}


Просто как приложение, открытое в браузере все работает. Что может быть не так?

Вот пример моего .env
POSTGRES_DB=database
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_HOST=database
POSTGRES_PORT=5432

APP_PORT=0
ASPNETCORE_ENVIRONMENT=Development
ASPNETCORE_HTTP_PORT=8080


Dockerfile
# Этот этап используется при запуске из VS в быстром режиме (по умолчанию для конфигурации отладки)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

RUN mkdir -p /app/reports-data && chown -R $APP_UID:$APP_UID /app/reports-data

USER $APP_UID
WORKDIR /app
EXPOSE ${ASPNETCORE_HTTP_PORT}


# Этот этап используется для сборки проекта службы
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Server/Server.csproj", "Server/"]
COPY ["Integration.Payment/Integration.Payment.csproj", "Integration.Payment/"]
COPY ["Server.Core/Server.Core.csproj", "Server.Core/"]
RUN dotnet restore "./Server/Server.csproj"
COPY . .
WORKDIR "/src/Server"
RUN dotnet build "./Server.csproj" -c $BUILD_CONFIGURATION -o /app/build

# Этот этап используется для публикации проекта службы, который будет скопирован на последний этап
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Server.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

# Этот этап используется в рабочей среде или при запуске из VS в обычном режиме (по умолчанию, когда конфигурация отладки не используется)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Server.dll"]


docker-compose.yml
services:
  server:
    image: ${DOCKER_REGISTRY-}server
    build:
      context: .
      dockerfile: Server/Dockerfile
    depends_on:
      - database
    networks:
      - app_network
    volumes:
      - reports-data:/app/reports-data
    ports:
      - "${APP_PORT:-0}:${ASPNETCORE_HTTP_PORT}"
    env_file:
      - .env 

  database:
    image: postgres:latest
    container_name: database
    env_file:
      - .env
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U postgres -d postgres" ]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 4G
    networks:
      - app_network
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres-data:
  reports-data: 

networks:
  app_network:
    driver: bridge
  • Вопрос задан
  • 139 просмотров
Подписаться 2 Простой 4 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы