如何在 .env 文件中使用环境变量来填充同一 .env 文件中的其他环境变量

45

我正在将base.env用作docker服务的env_file。在这个base.env文件中,有几个环境变量的部分会重复出现。例如,端口和IP地址对于三个不同的环境变量是相同的。 我想在一个环境变量中指定它们,并重复使用这些变量来填充其他环境变量。

以下是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

我尝试过写作

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

在docker-compose.yml文件中的适当服务的环境部分中,但是这将被容器解释为字面字符串。

是否有办法在base.env文件中实现我的需求? 感谢您的帮助!

8个回答

33
您实际上可以像这样做(至少在vlucas/dotenv包(php)中可以,不确定其他包,请自行检查)
MAIL_NAME=${MAIL_FROM}

阅读更多相关内容,请点击此处


6
这个不起作用。 - Amechi
你使用的是哪个库/语言?@amechi。此外,这仅已经与vlucas/dotenv包进行了测试。如果这在你选择的语言中不起作用,则已经提到过了。 - Saud Qureshi
@Amechi 可能你所缺少的,也就是这个答案中没有显示的,是需要先声明变量名 ${MAIL_FROM}。MAIL_FROM = foobar; 然后 MAIL_NAME=${MAIL_FROM} 就会变成 MAIL_NAME=foobar;。 - Marsellus
1
这个有效!可以确认。 - Abhishek
@Amechi 我认为这个答案只在 Laravel 的背景下才有效。 - Nathan Jones

27

在 env_file 中没有办法这样做,因为它不是作为 bash 命令运行的。这意味着变量不会被创建并连接到下一个出现的变量中。这些值只是按照 env_file 中的格式读取。


1
我刚在2022年11月08日测试了这个,它可以正常工作... - borisdonchev
1
确实需要更多关于哪里起作用的细节。 - AdamC

12

我在Node.js和React.js中都使用了$,并且两者都有效

POSTGRES_PORT=5432

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

在React中

REACT_APP_DOMAIN=domain.com

#API Configurations
REACT_APP_API_DOMAIN=$REACT_APP_DOMAIN


3

我暂时解决了这个问题,我创建了一个脚本来替换另一个环境文件中的环境变量文件,例如: .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

然后,您可以运行docker run命令来启动容器并加载您的环境变量(从.env.baseurl.env.uris):

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

这不是最好的解决方案,但目前对我有所帮助。


1
以防万一,https://www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html(*`envsubst`程序用环境变量的值替换*...) - undefined

2
我知道我来晚了一点,但我有同样的问题,并找到了解决方法。有一个叫做env-cmd的包,它允许您将.js文件用作.env文件。该文件只需导出一个对象,其中键是您的环境变量名称,值是值即可。这现在允许您在导出环境变量之前运行javascript,从而使用环境变量设置其他变量。

0
你可以使用类似这样的代码 ${yourVar}。
KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${KAFKA_IP}:${$KAFKA_PORT_NUMBER}

我在 PHP / Laravel 的 .env 文件上测试过,它可以正常工作。


0

使用Nextjs,在.env.local文件中我有以下变量:

NEXT_PUBLIC_BASE_URL = http://localhost:5000

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

它运行良好,我在变量NEXT_PUBLIC_API_USERS_URL_REGISTER中使用了变量NEXT_PUBLIC_BASE_URL


-1

有一个简单的方法可以做到这一点,你只需要运行:

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

这将追加/root/.bashrc中的所有环境变量,然后在传递env文件时转换那些尚未转换的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接