'How to Use Environment Variables in a .env file to fill out other environment variable in the same .env file

I am using a base.env as an env_file for several of my docker services.In this base.env I have several parts of the environment variable that repeat throughout the file. For example, port and ip are the same for three different environment variables. I would like to specify these in an environment variable and reuse those variables to fill out the other environment variables.

Here is base.env:

### Kafka
# kafka's port is 9092 by default in the docker-compose file
KAFKA_PORT_NUMBER=9092
KAFKA_TOPIC=some-topic
KAFKA_IP=kafka
KAFKA_CONN: //$KAFKA_IP:$KAFKA_PORT_NUMBER/$KAFKA_TOPIC
# kafka topic that is to be created. Note that ':1:3' should remain the same.
KAFKA_CREATE_TOPICS=$KAFKA_TOPIC:1:3
# the url for connecting to kafka
KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://$KAFKA_IP:$KAFKA_PORT_NUMBER

I have tried writing

KAFKA_CONN: //$${KAFKA_IP}:$${KAFKA_PORT_NUMBER}/$${KAFKA_TOPIC}

in the environment section of the appropriate service in the docker-compose.yml, but this gets interpreted as a literal string in the container.

Is there a way to do what I want in the base.env file? Thank you for your help!



Solution 1:[1]

There is no way to do this in an env_file since it is not run as a bash command. This means that the variable is not created and then concatenated into the next variable it appears in. The values are just read in as they are in the env_file.

Solution 2:[2]

You can actually do it like this (at least in vlucas/dotenv package (php), not sure about others, please check it yourself)

MAIL_NAME=${MAIL_FROM}

Read more about it here

Solution 3:[3]

I used $ in Node.js and React.js , and both worked

POSTGRES_PORT=5432

DATABASE_URL="postgresql://root@localhost:${POSTGRES_PORT}/dbname"

and in react

REACT_APP_DOMAIN=domain.com

#API Configurations
REACT_APP_API_DOMAIN=$REACT_APP_DOMAIN

Solution 4:[4]

I know that I am a little late to the party, but I had the same question and I found a way to do it. There is a package called env-cmd, which allows you to use a .js file as an .env file. The file simply needs to export an object with the keys being your environment variable names and the values being, well, the values. This now allows you to run javascript before the environment variables are exported and thus use environment variables to set others.

Solution 5:[5]

I temporarly managed to deal with this where I create a script to replace env file vars from another env file vars like so: .env.baseurl:

BASEURL1=http://127.0.0.1
BASEURL2=http://192.168.1.10

.env.uris.default:

URI1=${BASEURL1}/uri1
URI2=${BASEURL2}/uri2
URI3=${BASEURL2}/uri3

convert-env.sh:

#!/bin/bash
# To allow using sed correctly from same file multiple times
cp ./.env.uris.default ./.env.uris
# Go through each variable in .env.baseurl and store them as key value
for VAR in $(cat ./.env.baseurl); do
key=$(echo $VAR | cut -d "=" -f1)
value=$(echo $VAR | cut -d "=" -f2)
# Replace env vars by values in ./.env.uris
sed -i "s/\${$key}/$value/g" ./.env.uris
done

then you can run docker run command to start the container and load it with your env vars (from .env.baseurl to .env.uris) :

docker run -d --env-file "./.env.uris" <image>

This is not the best solution but helped me for now.

Solution 6:[6]

There is a simple way to do this you will just need to run:

env >>/root/.bashrc && source /root/.bashrc

this will append all environment variables inside /root/.bashrc then convert those if they have not been converted while passing the env-file

Solution 7:[7]

Using Nextjs, in the .env.local file I have the following variables:

NEXT_PUBLIC_BASE_URL = http://localhost:5000

NEXT_PUBLIC_API_USERS_URL_REGISTER = ${NEXT_PUBLIC_BASE_URL}/api/users/register

it works well, I used the variable NEXT_PUBLIC_BASE_URL in the variable NEXT_PUBLIC_API_USERS_URL_REGISTER.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Peter Kaufman
Solution 2 Saud Qureshi
Solution 3 Hamid Shoja
Solution 4 Marnix.hoh
Solution 5 Affes Salem
Solution 6 Affes Salem
Solution 7 Fabich