Efcore: SQL Migration does not run in docker

Created on 5 May 2019  路  6Comments  路  Source: dotnet/efcore

Describe the bug

I have followed some articles to be able to use the aspnet core application with sql server.
Unfortunately the migration command does not run.

Steps to reproduce the issue

Provide steps for us to reproduce the issue

  1. Creating a new Asp.net Core 2.2 Web (MVC) project from the official template in the Visual Studio 2019.
  2. Adding Docker-Compose support to the project.
version: '3.4'

services:
  api:
    image: ${DOCKER_REGISTRY-}api
    build:
      context: .
      dockerfile: Api/Dockerfile
    depends_on:
      - db

  db:
    image: "mcr.microsoft.com/mssql/server"
    environment:
      SA_PASSWORD: "Your_password123"
      ACCEPT_EULA: "Y"

The Docker file was generated by Visual Studio. I inserted some line to run the entrypoint.sh

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch 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

FROM build AS publish
# Inserted lines
COPY ./entrypoint.sh ./app/
RUN chmod +x ./app/entrypoint.sh
CMD /bin/bash ./app/entrypoint.sh
RUN dotnet publish "Api.csproj" -c Release -o /app

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

Entrypoint.sh is from the tutorial of docker page.

#!/bin/bash

set -e
run_cmd="dotnet run --server.urls http://*:80"

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

Expected behavior

When I run the Docker-Compose project in VS 2019 then I expect the migration has run. But this is not happen.

Additional information

I did not find any official step-by-step tutorial.

area-docs area-external customer-reported

Most helpful comment

short answer might be
c# public static async Task Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { scope.ServiceProvider.GetRequiredService<AppDbContext>().Database.Migrate(); } host.Run(); }
But I wouldn't say that it's recommended

All 6 comments

Migrations do not automatically run when your application begins. Running dotnet App.dll will only start the web server. A separate action is required to run migrations.

@ajcvickers - do you have documentation or recommendations on how to achieve migrations inside a docker workflow?

short answer might be
c# public static async Task Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { scope.ServiceProvider.GetRequiredService<AppDbContext>().Database.Migrate(); } host.Run(); }
But I wouldn't say that it's recommended

Notes from triage:

  • We don't currently have any guidance on how to do this. Putting this on the backlog to investigate what people should do here.
  • We should also consider if the web publishing support could handle this better--we need to follow up with the web tools team on this.
  • For now, a few ways to handle this are:

    • Run dotnet-ef commands in the container. This will work only if the SDK is installed into the container. @dabagab This might be what you are running into.

    • Generate a SQL script from Migrations and then use it to create/migrate the database from within the container. This will require a tool in the container that can run the SQL.

    • Use either dotnet-ef or a SQL script from outside the container using a connection to the database from outside the container.

Assigning to @bricelam to review; may be not action here.

@ajcvickers Any updated guidance on how to run migrations in Docker?

@syedhassaanahmed No; this issue is tracking adding this guidance to the docs.

Was this page helpful?
0 / 5 - 0 ratings