Peter Kaufman
Peter Kaufman

Reputation: 1102

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!

Upvotes: 60

Views: 101080

Answers (8)

Rachid Loukili
Rachid Loukili

Reputation: 845

you can use something like this ${yourVar}

KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${KAFKA_IP}:${$KAFKA_PORT_NUMBER}

I test this on PHP / Laravel .env it's working fine

Upvotes: 0

Affes Salem
Affes Salem

Reputation: 1649

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

Upvotes: -1

Affes Salem
Affes Salem

Reputation: 1649

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.

Upvotes: 3

Hamid Shoja
Hamid Shoja

Reputation: 4796

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

Upvotes: 17

Isam Naimi
Isam Naimi

Reputation: 21

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.

Upvotes: 0

Saud Qureshi
Saud Qureshi

Reputation: 1688

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

Upvotes: 46

Marnix.hoh
Marnix.hoh

Reputation: 1922

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.

Upvotes: 2

Peter Kaufman
Peter Kaufman

Reputation: 1102

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.

Upvotes: 31

Related Questions