docker-compose.yml file under the environment key, passing them via the -e flag in the docker run command, or configuring them directly within the Docker Desktop GUI for running containers. This approach allows you to inject configuration values like database URLs or API keys without modifying the application code, ensuring flexibility across different deployment stages.
Using Docker Compose Files
The most common and maintainable way to manage environment variables is through adocker-compose.yml file. This method is ideal for multi-container applications where services need to communicate or share configuration. Inside the service definition, you can use the environment block.
There are two primary syntaxes for this block. The first uses a list format, which is cleaner for simple key-value pairs:
services:
web-app:
image: my-app:latest
environment:
- DB_HOST=localhost
- DB_PORT=5432
- APP_ENV=production
Alternatively, you can use a dictionary format, which is useful if you need to handle variables with special characters more explicitly or if you prefer mapping syntax:
services:
web-app:
image: my-app:latest
environment:
DB_HOST: localhost
DB_PORT: "5432"
APP_ENV: production
When using the dictionary format, ensure that numeric values or strings containing spaces are quoted to prevent YAML parsing errors. Docker Compose will automatically inject these variables into the container's environment when it starts the service. If you have sensitive data, consider using a .env file alongside your compose file. Docker Compose automatically loads variables from a .env file in the current directory, allowing you to reference them in your compose file using ${VARIABLE_NAME}. This keeps secrets out of version control while maintaining readability in your configuration files.
Running Containers via Command Line
For quick testing or one-off containers, you can pass environment variables directly using thedocker run command. This method does not require a compose file and is executed immediately in your terminal. Use the -e or --env flag followed by the variable name and value.
docker run -d -p 8080:80 \
-e DATABASE_URL="postgresql://user:pass@db:5432/mydb" \
-e DEBUG_MODE=true \
my-app:latest
You can specify multiple -e flags to set as many variables as needed. Note that if your variable values contain spaces or special shell characters, you must wrap the entire =value part in quotes to ensure the shell passes the string correctly to Docker. For example, -e "SECRET_KEY=my secret key" works, whereas -e SECRET_KEY=my secret key might cause the shell to interpret the space as a new argument. This command-line approach is excellent for debugging but becomes cumbersome for complex configurations with many variables. In such cases, switching to Docker Compose or using environment files (--env-file) is recommended. You can load an entire file of variables using --env-file .env, which is particularly useful for CI/CD pipelines or large-scale deployments.
Configuring via Docker Desktop GUI
Docker Desktop provides a graphical interface that allows you to modify container settings without editing files or typing commands. This is helpful for users who prefer visual workflows or need to quickly adjust variables for troubleshooting. To do this, start the container normally if it is not already running. Once the container is active, locate it in the Containers tab of the Docker Desktop dashboard. Click on the specific container to view its details. Look for the "Environment Variables" section within the container's configuration panel. Here, you can click "Add Variable" to insert new key-value pairs. However, please note that changes made via the GUI often require restarting the container to take effect, and some modifications might be overwritten if you redeploy the container using a compose file or command line that does not include those variables. Always check your source configuration (compose file or run command) after making GUI changes to ensure consistency. If you encounter issues with network connectivity after changing variables, refer to our guide on Troubleshooting Docker Desktop DNS Lookup Failure on Windows and Mac to rule out networking conflicts.Best Practices for Environment Management
Managing environment variables effectively requires attention to security and clarity. Never hardcode sensitive information like passwords or API keys directly in your source code or public repositories. Instead, use Docker’s built-in support for.env files, which are typically excluded from version control via .gitignore. When naming variables, follow a consistent convention, such as uppercase letters with underscores (e.g., DB_HOST), to distinguish them from other process parameters. Additionally, provide default values in your application code so that it fails gracefully if a variable is missing, rather than crashing unexpectedly. For complex setups, consider using Docker Secrets if you are deploying with Swarm mode, although this is beyond the scope of standard Docker Desktop usage. Regularly audit your environment variables to remove unused ones that might clutter the container's environment and potentially expose unnecessary information. If you are dealing with storage issues related to large images or volumes while managing these configurations, you might also find our article on Docker Folder Size is Greater than Actual Disk Space helpful for optimizing your local disk usage.
Frequently Asked Questions
How do I verify that an environment variable was set correctly?
You can verify variables by executing a command inside the running container, such as docker exec -it <container_id> env. This prints all environment variables currently loaded in the container, allowing you to search for your specific key. Alternatively, your application can log the values at startup to confirm they are being read correctly.
Can I override environment variables set in a docker-compose.yml file at runtime?
Yes, you can override variables defined in the compose file by passing additional -e flags in the docker run command if you bypass compose, or by setting higher-priority variables in your shell environment before running docker-compose up. Docker Compose respects the order of precedence, allowing shell variables to overwrite those in the compose file if configured appropriately.
What happens if an environment variable is missing in my application?
If your application expects a variable that is not present, it may crash, throw an error, or fall back to a hardcoded default depending on how the code is written. It is best practice to design your application to handle missing variables gracefully, perhaps by logging a warning and using a safe default value instead of failing immediately.
Do environment variables persist after the container stops?
No, environment variables are part of the container's runtime state and do not persist after the container is stopped or removed. They are injected into the process memory each time the container starts. To make changes permanent, you must update your configuration source, such as the docker-compose.yml file or the docker run command, and restart the container.
Is it safe to store passwords in environment variables?
While better than hardcoding them in source code, storing passwords in plain text environment variables is still less secure than using dedicated secret management solutions. For high-security environments, consider using Docker Secrets or external vaults. For local development, using .env files that are gitignored is an acceptable standard practice.