Home >Backend Development >Golang >Override Go app configuration with Environment variable

Override Go app configuration with Environment variable

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-18 07:43:14155browse

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
    }
}

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

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.

The above is the detailed content of Override Go app configuration with Environment variable. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn