Что нового
  • Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Override Go app configuration with Environment variable

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
5,923
Баллы
155
How to make containerized applications more flexible ?


For at least 10+ years, we develop applications to work in containers. I won't be considering advantages and disadvantages of this approach but want to focus on the application flexibility. Almost every dependency, i.e. storage containers like Postgres, MySql, Redis a so on, allows us to override most of the configuration properties via environment variables. Docker containers stimulate us to use environment variables in our containers. But unlike of well-known services programmers develop custom applications on their own approach. I prefer to configure applications using JSON configuration files. But what should I do if in configuration files 100 and more properties, I can't use Environment variable for each property. Instead of this I decided to use JSON config file as a template with working default values and override properties at application start if appropriate environment variables were set.

How to implement such approach in Go application


Nowadays, we don't use a single Docker image; we prefer to have some orchestration, even something simple like docker-compose. In docker-compose we usually create .env-files. As it was mentioned before, environment variables are working well with well-known images like Postgres or MySQL. Consider we are having the following application config (JSON) that is using as an absolutely working template with the default values.


{
"server": {
"address": "0.0.0.0",
"port": 8182
},
"logging": {
"level": "info",
"http_log": false,
"http_console_out": false
}
}

We should be able to override any of this value; consider that we should increase log level to debug and enable HTTP logging. For doing this easy, we just have to create technical env variables that have a special name pattern:

  1. starts with a double underscore __
  2. contains full property path, i.e. for log level __logging.level .

Using

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

you could do it absolutely easy, all what you have to do:

  1. Read JSON object from file using go_config_extender.LoadJSONConfigWithEnvOverride function (you could see full example in a

    Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

    )
  2. Set env file like this:

# all previous variables
__logging.level="debug"
__logging.http_log=true

That's all, and please give us a STAR on GitHub

Conclusion


This approach and package could be used not only for containerized applications but for apps running natively too. This package is successfully working on our

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

 
Вверх