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:
- starts with a double underscore __
- contains full property path, i.e. for log level __logging.level .
Using this go package, 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 test) - 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 authorization server.
Top comments (0)