Why Environment Variables Are Not Configuration Files (And How to Use Them Correctly)

Environment variables are often misunderstood and misused in software development. Some developers rely on them to manage all sorts of app configurations. But environment variables have a specific purpose, and treating them like full-blown configuration files can make your system harder to maintain. Let’s dive into the right way to use environment variables and how they differ from configuration files.

What Are Environment Variables Meant For?

Environment variables exist to define environment-specific settings - values that can change depending on where the application is running, such as:

  • Database URLs (e.g., for development vs. production)
  • API keys or service credentials
  • Environment names (e.g., DEV, STAGING, PRODUCTION)

They allow your application to adapt to different environments without hardcoding values into the codebase.

The Problem with Treating Env as Config Files

While environment variables are great for certain settings, using them to handle all configuration needs can lead to:

  1. Lack of Structure and Readability: Config files like YAML, JSON, or TOML are organized and structured. They can hold multiple settings in a clear format, with comments and nested values. Environment variables, on the other hand, are flat and don’t allow for complex structures. Managing detailed settings with environment variables becomes messy and error-prone.

  2. Duplication Across Environments: When you use environment variables as config files, you end up duplicating large amounts of configuration across multiple environments (like dev, staging, and prod). Config files are much easier to manage and share across environments, while environment variables should only focus on what changes per environment.

Where to Use Environment Variables vs. Configuration Files

Here’s a simple comparison to clarify what belongs where:

Environment Variables Configuration Files
Short, simple values that change per environment Structured, detailed app settings
Example: DB_URL=postgres://... Example: log_level: debug
Environment name Feature flags and toggles
Example: NODE_ENV=production Example: max_connections: 100
API keys or service credentials Logging or performance settings
Example: API_KEY=xyz123 Example: retry_policy: exponential_backoff
Runtime-specific values (e.g., ports, hosts)** App configuration (e.g., feature settings)**

As you can see, environment variables should be used for environment-specific settings - values that change depending on where the app is running. Configuration files, however, should handle the bulk of your app’s settings. They provide better structure, clarity, and version control.

Conclusion

Environment variables and configuration files serve distinct purposes. Use environment variables for simple, environment-specific settings, and rely on configuration files for structured, detailed application settings. By keeping each in its proper place, your application will be easier to maintain, scale, and deploy.

From my experience, maintaining a clean separation between environment variables and configuration files has always led to more predictable and manageable systems. When environment variables are overused for config, it often leads to confusion, making it harder to understand and troubleshoot issues. By following this separation, your app becomes much more robust and adaptable to different environments.

Wei-Ming Thor

I create practical guides on Software Engineering, Data Science, and Machine Learning.

Background

Full-stack engineer who builds web and mobile apps. Now, exploring Machine Learning and Data Engineering. Read more

Writing unmaintainable code since 2010.

Skill/languages

Best: JavaScript, Python
Others: Android, iOS, C, React Native, Ruby, PHP

Work

Engineering Manager

Location

Kuala Lumpur, Malaysia

Open Source
Support

Turn coffee into coding guides. Buy me coffee