- ABP Framework version: v7.2.2
- UI type: MVC /
- DB provider: EF Core
- Tiered (MVC) or Identity Server Separated (Angular): no
Facing issue while doing a local docker deployment for single tier app. Finding difficult to migrate database. It would be great if you could suggest or provide some documentation something similar to tiered app(https://support.abp.io/QA/Questions/4729/Local-Docker-Deployment)
- Exception message and stack trace:
ClientConnectionId:01dffe83-aabb-4392-af59-ef5aa1e279a2
mrs-web | Error Number:4060,State:1,Class:11
mrs-web | [17:50:49 ERR] ---------- Exception Data ----------
mrs-web | HelpLink.ProdName = Microsoft SQL Server
mrs-web | HelpLink.EvtSrc = MSSQLServer
mrs-web | HelpLink.EvtID = 4060
mrs-web | HelpLink.BaseHelpUrl = https://go.microsoft.com/fwlink
mrs-web | HelpLink.LinkId = 20476
mrs-web |
mrs-web | [17:50:51 ERR] An error occurred using the connection to database 'MRS' on server 'mrs-db'.
mrs-web | [17:50:51 ERR] Cannot open database "MRS" requested by the login. The login failed.
mrs-web | Login failed for user 'sa'.
mrs-web | Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot open database "MRS" requested by the login. The login failed.
mrs-web | Login failed for user 'sa'.
mrs-web | at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
mrs-web | at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) mrs-web | at Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource
1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
mrs-web | at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) mrs-web | at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource
1 retry, DbConnectionOptions userOptions)
mrs-web | at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 retry, SqlConnectionOverrides overrides) mrs-web | at Microsoft.Data.SqlClient.SqlConnection.InternalOpenAsync(CancellationToken cancellationToken) mrs-web | --- End of stack trace from previous location --- mrs-web | at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternalAsync(Boolean errorsExpected, CancellationToken cancellationToken) mrs-web | at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternalAsync(Boolean errorsExpected, CancellationToken cancellationToken) mrs-web | at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenAsync(CancellationToken cancellationToken, Boolean errorsExpected) mrs-web | at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken) mrs-web | at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionAsync(CancellationToken cancellationToken) mrs-web | at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider
1.CreateDbContextWithTransactionAsync(IUnitOfWork unitOfWork)
mrs-web | at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider1.CreateDbContextAsync(IUnitOfWork unitOfWork) mrs-web | at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider
1.CreateDbContextAsync(IUnitOfWork unitOfWork, String connectionStringName, String connectionString)
mrs-web | at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider1.GetDbContextAsync() mrs-web | at Volo.Abp.Domain.Repositories.EntityFrameworkCore.EfCoreRepository
2.GetDbSetAsync()
mrs-web | at Volo.Abp.Domain.Repositories.EntityFrameworkCore.EfCoreRepository2.GetListAsync(Boolean includeDetails, CancellationToken cancellationToken) mrs-web | at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo) mrs-web | at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue
1.ProceedAsync()
mrs-web | at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
mrs-web | at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func
3 proceed)
mrs-web | at Volo.Abp.FeatureManagement.StaticFeatureSaver.UpdateChangedFeatureGroupsAsync(IEnumerable`1 featureGroupRecords)
mrs-web | at Volo.Abp.FeatureManagement.StaticFeatureSaver.SaveAsync()
mrs-web | at Volo.Abp.FeatureManagement.StaticFeatureSaver.SaveAsync()
mrs-web | at Volo.Abp.FeatureManagement.StaticFeatureSaver.SaveAsync()
mrs-web | at Volo.Abp.FeatureManagement.StaticFeatureSaver.SaveAsync()
mrs-web | at Volo.Abp.FeatureManagement.AbpFeatureManagementDomainModule.<>c__DisplayClass8_0.<
- Steps to reproduce the issue:"
7 Answer(s)
-
0
Can you share your dockerfile and docker-compose?
-
0
Please check https://docs.abp.io/en/commercial/latest/startup-templates/application/deployment-docker-compose?UI=MVC&DB=EF&Tiered=No
-
0
Please check https://docs.abp.io/en/commercial/latest/startup-templates/application/deployment-docker-compose?UI=MVC&DB=EF&Tiered=No
Can you suggest some production deployment ideas using above code?
-
0
Can you share your dockerfile and docker-compose?
I'm able to do build and run container on my docker desktop with the below docker files using build-images-locally.ps1and run-docker.ps1.
But how should I use my docker file to deploy on production to docker container registry. What changes should I make or any suggestions?
FROM mcr.microsoft.com/dotnet/aspnet:7.0 COPY bin/Release/net7.0/publish/ app/ WORKDIR /app ENTRYPOINT ["dotnet", "Acme.Books.dll"]
version: '3.9' services: mrs-web: image: pentapack/mrs:latest container_name: mrs-web build: context: ../../ dockerfile: Pentapack.MRS/Dockerfile.local environment: - ASPNETCORE_URLS=https://+:443;http://+:80; - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc - ConnectionStrings__Default=Server=mrs-db,1433;Database=MRS;User=sa;Password=Aqwx1379!;TrustServerCertificate=true; ports: - "443:443" depends_on: mrs-db: condition: service_healthy restart: on-failure volumes: - ./certs:/root/certificate networks: - mrs-network mrs-db-migrator: image: pentapack/mrs:latest container_name: mrs-db-migrator build: context: ../../ dockerfile: Pentapack.MRS/Dockerfile.local environment: - ConnectionStrings__Default=Server=mrs-db,1433;Database=MRS;User=sa;Password=Aqwx1379!;TrustServerCertificate=true; command: - --migrate-database depends_on: mrs-db: condition: service_healthy networks: - mrs-network mrs-db: container_name: mrs-db image: 'mcr.microsoft.com/mssql/server:latest' ports: - "1433:1433" volumes: - mrs-data:/data/db environment: - ACCEPT_EULA=Y - SA_PASSWORD=Aqwx1379! networks: - mrs-network healthcheck: test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-Usa", "-PAqwx1379!", "-Q", "select 1"] interval: 10s timeout: 10s retries: 10 volumes: mrs-data: name: mrs-data networks: mrs-network: name: mrs-network driver: bridge
-
0
Please read https://docs.abp.io/en/commercial/latest/startup-templates/application/deployment-docker-compose?UI=MVC&DB=EF&Tiered=No
There is a detailed explanation about what to override, how to override and why to override.
-
0
Please read https://docs.abp.io/en/commercial/latest/startup-templates/application/deployment-docker-compose?UI=MVC&DB=EF&Tiered=No
There is a detailed explanation about what to override, how to override and why to override.
I'm confused with Db Migrator, no tiered application don't have DbMigrator.dll. How can we migrate database without that?
-
0
Okay sorry, I thought you are using non-tiered app template but you are basically using no-layered app template.
DbMigration in no-layered application template is done by passing the argument
--migrate-database
.The initial docker-compose file generated with the template (mrs-db-migrator service in your application) basically runs as db-migrator and exits if you examine the
Program.cs
:if (IsMigrateDatabase(args)) { await app.Services.GetRequiredService<MyAppDbMigrationService>().MigrateAsync(); return 0; }
So the docker-compose file runs the same docker image as 2 different services:
- One of them is the application itself: mrs-web
- Other one is the db-migrator: mrs-db-migrator
So, when you run the docker-compose file, it will look like:
Which indicates the Exited (0) one is being the db-migrator. You can perfectly use it as it is just fine.
Another way
You can also drop using the db-migrator and simply migrate your database whenever you run your application.
Simply override the
OnPostApplicationInitializationAsync
and add:public override async Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context) { await context.ServiceProvider .GetRequiredService<MyAppDbMigrationService>() .MigrateAsync(); }
This will run the db-migration after your application is initialized instead of manually triggering it with an argument. You can also drop the mrs-db-migrator service in the docker-compose file if you choose to do so.