- Регистрация
- 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:
Using you could do it absolutely easy, all what you have to do:
# 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 .
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:
- starts with a double underscore __
- contains full property path, i.e. for log level __logging.level .
Using you could do it absolutely easy, all what you have to do:
- Read JSON object from file using go_config_extender.LoadJSONConfigWithEnvOverride function (you could see full example in a )
- 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 .