Как безопасно получить строку подключения в контейнер docker в heroku? - PullRequest
0 голосов
/ 30 марта 2020

Я схожу с ума, пытаясь найти способ безопасного получения строки подключения в контейнер docker при использовании Heroku. Это то, что документы сказали мне:

"Мы предлагаем использовать ENV для переменных времени выполнения (например, GEM_PATH) и конфигурацию heroku для учетных данных, чтобы конфиденциальные учетные данные не были случайно проверены в источнике Контроль кода. "

В этом случае для строки подключения я хотел бы установить переменную через конфигурацию heroku, вот что я сделал. Нажмите this , пытаясь использовать конфигурацию heroku: edit, поэтому я использую конфигурацию heroku - json.

Эта переменная находится там:

  "ConnectionStrings__Default": "MyConnectionString"

Что касается того, как передать это в настоящий dockerfile, я не очень хорошо разбираюсь с docker, поэтому многое из этого - работа с догадками в сочетании с тем, что я нашел о внешнем получении строк соединения в c# здесь, Я подозреваю, что проблема где-то здесь, поэтому, пожалуйста, скажите мне, если это неверно:

# publish
FROM build AS publish
WORKDIR /src/webapplication/webapplication
RUN dotnet publish -c Release -o /src/publish
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=publish /src/publish .
# heroku uses the following
CMD Default=$ConnectionStrings__Default ASPNETCORE_URLS=http://*:$PORT dotnet webapplication.dll

Правильно ли я вставляю переменную конфигурации в приложение ядра pnet в docker таким образом ? Я мог найти очень мало примеров этого, так что не уверен.

Код, получающий строку подключения (работает при использовании json .config):

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string basePath = Directory.GetCurrentDirectory();
            if (!optionsBuilder.IsConfigured)
            {
                var builder = new ConfigurationBuilder()
       .SetBasePath(basePath)
       .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

                IConfigurationRoot configuration = builder.Build();

                string connectionString = configuration.GetConnectionString("Default");
                optionsBuilder.UseSqlServer(connectionString)
                    .EnableSensitiveDataLogging();
                optionsBuilder.UseLazyLoadingProxies();

            }
        }

Ошибка:

System.ArgumentNullException: Value cannot be null. (Parameter 'connectionString')

Если бы кто-нибудь мог дать мне несколько указателей, это означало бы для меня мир, потому что я хочу развернуть эту штуку, но я не знаю, что делать.

1 Ответ

0 голосов
/ 01 апреля 2020

После .AddJsonFile() вам нужно вызвать .AddEnvironmentVariables(), который перезапишет любые настройки из вашего файла настроек с соответствующими переменными среды.

Ваш код должен выглядеть следующим образом

var builder = new ConfigurationBuilder()
    .SetBasePath(basePath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddEnvironmentVariables();

Другой вариант - использовать флаг -e при вызове docker run для установки переменных среды в контейнере

https://docs.docker.com/engine/reference/run/#env Окружающая среда-переменные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...