Я извлек и запустил образ контейнера SQL Server 2017, используя следующую команду:
docker pull microsoft/mssql-server-linux
docker run --name mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=!Abcd123' -p 1433:1433 -d microsoft/mssql-server-linux
И я также развернул приложение ASP.NET Core Web API в контейнере Docker, используя следующие команды:
dotnet publish -c Release -o Output
docker build -t apitest .
docker run -p 3000:80 --name apitest_1 apitest
Содержимое Dockerfile
:
FROM microsoft/dotnet
COPY Output /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "DockerSQLTest.dll"]
В моем приложении веб-API я создал миграцию Entity Framework Core, которая создаст базу данных и заполнит некоторые данные.В методе Configure
класса Startup
я добавляю следующий код для применения отложенных миграций к базе данных:
public async void Configure(IApplicationBuilder app,
IHostingEnvironment env,
StudentDbContext dbContext)
{
await dbContext.Database.MigrateAsync();
...
}
И строка подключения к базе данных извлекается из appsettings.json
, которая содержит следующий раздел:
"ConnectionStrings": {
"DefaultConnection": "Server=localhost,1433;Database=student;User Id=sa;Password=!Abcd123;"
}
Но приложение не может работать правильно, сообщение об исключении:
fail: WebApplication6.Startup[0]
System.Threading.Tasks.TaskCanceledException: A task was canceled.
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(Boolean errorsExpected, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenAsync(CancellationToken cancellationToken, Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.<>c__DisplayClass20_0.<<ExistsAsync>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.ExistsAsync(CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.MigrateAsync(String targetMigration, CancellationToken cancellationToken)
Что-то не так?