我正在容器化我的 Python 应用程序。通常,我会加载
.env
文件并使用 dotenv
读取变量。
示例:
from dotenv import load_dotenv
import os
def test_env():
load_dotenv()
print(f"private_key : {repr(os.environ.get('PRIVATE_KEY'))}")
if __name__ == '__main__':
test_env()
并且在我的
.env
文件中,我必须在变量周围加上引号才能使其正常工作。示例:
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n.....=\n-----END PRIVATE KEY-----\n"
这在我的 Python 应用程序中正确打印出来。
但是,当我运行相同的代码但使用 Docker 的
--env-file
时,我会在每个 \
中添加一个额外的 \n
。
docker 命令示例:
docker run --env-file ./.env -d -p $(RUN_PORT):$(RUN_PORT) --name $(DOCKER_CONTAINER_NAME) $(FULL_IMG_NAME)
输出如下:
'-----BEGIN PRIVATE KEY-----\\n...=\\n-----END PRIVATE KEY-----\\n'
这与 .env
文件变量周围是否有“”无关。所有 "" 对变量所做的都是变量的文字,而 dotenv
则不是这样。
需要做什么?
dotenv
处理文本并解码转义序列。因此它用换行符替换 \n
。
os.environ.get
没有,因此您的字符串包含两个字符:反斜杠和“n”。然后,当您打印它时,repr
函数会对反斜杠进行转义,因此您会得到所看到的双反斜杠。
您可以使用像这样的
decode
函数在 Python 中自行处理转义序列
import os
def test_env():
private_key = bytes(os.environ.get('PRIVATE_KEY'), "utf-8").decode("unicode_escape")
print(f"private_key : {private_key}")
if __name__ == '__main__':
test_env()
这应该从环境中读取私钥并将
\n
更改为换行符,就像您习惯的 dotenv
所做的那样。