簡體   English   中英

如何使用.env文件中的環境變量來填寫同一個.env文件中的其他環境變量

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

我使用 base.env 作為我的幾個 docker 服務的 env_file。在這個 base.env 中,我有幾個環境變量部分在整個文件中重復。 比如port和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 文件中做我想做的事? 謝謝您的幫助!

你實際上可以這樣做(至少在vlucas/dotenv包(php)中,其他人不確定,請自行檢查)

MAIL_NAME=${MAIL_FROM}

在此處閱讀更多相關信息

在 env_file 中無法執行此操作,因為它不是作為 bash 命令運行的。 這意味着該變量不會被創建,然后被連接到它出現的下一個變量中。這些值只是在 env_file 中被讀入。

我知道我參加聚會有點晚了,但我有同樣的問題,我找到了解決辦法。 有一個名為env-cmd的包,它允許您將 .js 文件用作 .env 文件。 該文件只需要導出一個對象,鍵是環境變量名稱,值是值。 這現在允許您在導出環境變量之前運行 javascript,從而使用環境變量來設置其他變量。

我暫時設法解決了這個問題,我創建了一個腳本來從另一個環境文件變量中替換環境文件變量,如下所示: .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

轉換-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 運行命令來啟動容器並使用你的環境變量加載它(從.env.baseurl.env.uris ):

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

這不是最好的解決方案,但現在對我有幫助。

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

POSTGRES_PORT=5432

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

並在反應

REACT_APP_DOMAIN=domain.com

#API Configurations
REACT_APP_API_DOMAIN=$REACT_APP_DOMAIN

有一種簡單的方法可以做到這一點,您只需要運行:

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

這將 append /root/.bashrc 中的所有環境變量然后轉換那些,如果它們在傳遞 env 文件時沒有被轉換

你可以使用這樣的東西 ${yourVar}

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

我在 PHP / Laravel.env 上測試它工作正常

與 Vite 一起工作:

VITE_BASE_API = http://192.168.1.133:8000/api
VITE_TOPICS_LIST = ${VITE_BASE_API}/topics/

使用 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_BASE_URL中使用了變量NEXT_PUBLIC_API_USERS_URL_REGISTER

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM