当从 Docker 的 --env-file 参数读取 Python 中的环境变量时,每个 ' 都会添加一个 '\' '。如何没有多余的“\”?

问题描述 投票:0回答:1

我正在容器化我的 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
则不是这样。

需要做什么?

python docker environment-variables
1个回答
0
投票

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
所做的那样。

© www.soinside.com 2019 - 2024. All rights reserved.