DEV Community

Cover image for Override Go app configuration with Environment variable
Ushakov Michael for Wissance

Posted on

Override Go app configuration with Environment variable

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
    }
}
Enter fullscreen mode Exit fullscreen mode

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 this go package, 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 test)
  2. Set env file like this:
# all previous variables
__logging.level="debug"
__logging.http_log=true
Enter fullscreen mode Exit fullscreen mode

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)