Как собрать общий конфиг для docker и asp net?

docker-compose
version: '3.4'

services:
coredocker:
    image: coredocker
    build:
    context: .
    dockerfile: CoreDocker/Dockerfile
sql.data:
    image: microsoft/mssql-server-linux:2017-latest
    environment:
    - SA_PASSWORD=Pass@word
    - ACCEPT_EULA=Y
    ports:
    - "1433:1433"


appsettings.json
{
    "Logging": {
        "LogLevel": {
        "Default": "Warning"
        }
    },
    "AllowedHosts": "*"
}

secrets.json
"ConnectionStrings:LocalContext": "Data Source=localhost,1433;Initial Catalog=tempdb;Persist Security Info=True;User ID=sa;Password=Pass@word;Trust Server Certificate=True",
"ConnectionStrings:DockerContext": "Server=sql.data;Database=tempdb;User=sa;Password=Pass@word;TrustServerCertificate=true;",

program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<DockerContext>(options =>
                options.UseSqlServer(builder.Configuration.GetConnectionString("DockerContext") ?? throw new InvalidOperationException("Connection string 'DockerContext' not found.")));


Код выше прекрасно работает внутри контейнера. Но как только мне надо провести обновление базы данных,
dotnet ef database update --context DockerContext
приходится менять в конфиге
Server=sql.data,1433;
на 
Server=localhost,1433;


как собрать общий конфиг чтоб не было необходимости в постоянных изменения в secrets.json ?
  • Вопрос задан
  • 500 просмотров
Пригласить эксперта
Ответы на вопрос 2
@mxelgin Автор вопроса
Вот мое решение
public class DockerContext: DbContext
    {
        private bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true"; } }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!InDocker)
            {
// Здесь переопределяем ConnectionString для миграций
            }
        }


или так
program.cs
public static bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true"; } }
public static void Main(string[] args)
{
  var builder = WebApplication.CreateBuilder(args);
  builder.Services.AddDbContext<DockerContext>(options =>
                options.UseSqlServer(builder.Configuration.GetConnectionString(InDocker ? "DockerContext" : "MigrationContext") ?? throw new InvalidOperationException("Connection string 'DockerContext' not found.")));
}
Ответ написан
@OwDafuq
Т.к. настройки для подключения хранятся в секретах, то вариант с 2 конфига отпадает.
Примем за условность, что, накатывая миграции руками, мы будем находиться в Development среде, а при запуске приложения в Docker'e - в любой другой, тогда можно сделать что-то такое:
string connectionString;
if (builder.Environment.IsDevelopment())
{
    connectionString = builder.Configuration.GetConnectionString("LocalContext")!;
}
else
{
    connectionString = builder.Configuration.GetConnectionString("DockerContext")!;
}

builder.Services.AddDbContext<DockerContext>(options => options.UseSqlServer(connectionString));
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы