Python 如何为容器提供Azure应用程序服务“;请使用"。环境变量?

Python 如何为容器提供Azure应用程序服务“;请使用"。环境变量?,python,azure,docker,azure-devops,dotenv,Python,Azure,Docker,Azure Devops,Dotenv,我已经使用Azure应用程序服务从容器注册表中的docker容器部署了一个Python web应用程序。在我的应用程序中,我使用dotenv加载机密,在本地运行docker run--env file=.env my container来传递.env变量,但我真的不知道在部署到Azure时如何执行 我使用dotenv的方式如下: import os from dotenv import load_dotenv load_dotenv() SERVER = os.getenv("SE

我已经使用Azure应用程序服务从容器注册表中的docker容器部署了一个Python web应用程序。在我的应用程序中,我使用dotenv加载机密,在本地运行
docker run--env file=.env my container
来传递
.env
变量,但我真的不知道在部署到Azure时如何执行

我使用dotenv的方式如下:

import os
from dotenv import load_dotenv

load_dotenv()

SERVER = os.getenv("SERVER_NAME")
DATABASE = os.getenv("DB_NAME")
USERNAME = os.getenv("USERNAME")
PASSWORD = os.getenv("PASSWORD")
PORT = os.getenv("PORT", default=1433)
DRIVER = os.getenv("DRIVER")
如何让容器获取.env变量


我已将这些秘密添加到Azure Key Vault,但我不确定如何将它们传递到容器。

关于将变量传递到Dockerfile,请检查我的答案

请在from之后添加参数

FROM alpine

ARG serverName
RUN echo $serverName

然后像这样运行它

-任务:Docker@2
投入:
containerRegistry:“DevPSManual acr”
命令:“构建”
Dockerfile:'stackoverflow/85 docker/Dockerfile'
参数:'--build arg a_version=$(服务器名称)'
在从KeyVault获取值方面,您可以使用

#Azure密钥保险库
#下载Azure密钥保险库机密
-任务:AzureKeyVault@1
投入:
azureSubscription:
KeyVault名称:
secretsFilter:“*”
runAsPreJob:false#仅限Azure DevOps服务
请注意,此任务创建的by deault变量被标记为机密,因此它们不会映射到环境变量

-powershell:|
写入主机“使用输入宏工作:$(mySecret)”
写入主机“直接使用env变量无效:$env:MYSECRET”
写入主机“使用管道中映射的全局机密变量也不起作用:$env:global_MYSECRET”
编写主机“使用管道工程中映射的全局非机密变量:$env:global\u MY\u mapped\u env\u var”
写入主机“使用映射的环境变量执行此任务有效,建议:$env:MY_mapped_env_var”
环境:
MY_MAPPED_ENV_VAR:$(mySecret)#映射到环境变量的推荐方法

关于向Dockerfile传递变量,请检查我的答案

请在from之后添加参数

FROM alpine

ARG serverName
RUN echo $serverName

然后像这样运行它

-任务:Docker@2
投入:
containerRegistry:“DevPSManual acr”
命令:“构建”
Dockerfile:'stackoverflow/85 docker/Dockerfile'
参数:'--build arg a_version=$(服务器名称)'
在从KeyVault获取值方面,您可以使用

#Azure密钥保险库
#下载Azure密钥保险库机密
-任务:AzureKeyVault@1
投入:
azureSubscription:
KeyVault名称:
secretsFilter:“*”
runAsPreJob:false#仅限Azure DevOps服务
请注意,此任务创建的by deault变量被标记为机密,因此它们不会映射到环境变量

-powershell:|
写入主机“使用输入宏工作:$(mySecret)”
写入主机“直接使用env变量无效:$env:MYSECRET”
写入主机“使用管道中映射的全局机密变量也不起作用:$env:global_MYSECRET”
编写主机“使用管道工程中映射的全局非机密变量:$env:global\u MY\u mapped\u env\u var”
写入主机“使用映射的环境变量执行此任务有效,建议:$env:MY_mapped_env_var”
环境:
MY_MAPPED_ENV_VAR:$(mySecret)#映射到环境变量的推荐方法

要从密钥库中提取机密并将其用作应用程序中的环境变量,请使用密钥库引用,如下所述:

然后只需将引用添加到应用程序设置中。例如:

@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)
就这样。无需修改dotenv代码来执行任何特殊操作,因为应用程序设置已经被应用程序服务作为环境变量注入到应用程序中

不要忘记将您的应用程序服务实例(托管标识)添加到密钥库的访问策略中,否则这些都不起作用-

要从密钥库中提取机密并将其用作应用程序中的环境变量,请使用密钥库引用,如下所述:

然后只需将引用添加到应用程序设置中。例如:

@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)
就这样。无需修改dotenv代码来执行任何特殊操作,因为应用程序设置已经被应用程序服务作为环境变量注入到应用程序中

不要忘记将您的应用程序服务实例(托管标识)添加到密钥库的访问策略中,否则这些都不起作用-

我也发现了这一点,但直接在代码中获取机密是一个坏主意吗?您可能会在这里遇到的问题是,您的机密是否会以某种方式被记录下来。如果没有,你就准备好出发了。如果你只是在脚本中使用,我的意思是获取秘密,传递它们,它们是安全的-你很好。只需检查日志并尝试找到它们-这是最好的识别器。我也发现了这一点,但直接在代码中获取机密是一个坏主意吗?您可能会在这里遇到的问题是,您的机密是否会以某种方式被记录。如果没有,你就准备好出发了。如果你只是在脚本中使用,我的意思是获取秘密,传递它们,它们是安全的-你很好。只需检查日志,并尝试找到它们-这是最好的标识符。这实际上相当不错。因此,如果我有6个秘密,我会添加6个应用程序设置-每个秘密一个?这是完全正确的。我接受了第一个答案,因为它最初似乎是可行的,但我最终选择了你的解决方案。我来这里不是为了要点,我来这里是为了看到世界不燃烧。这实际上相当不错。因此,如果我有6个秘密,我会添加6个应用程序设置-每个秘密对应一个?这是完全正确的。我接受了第一个答案,因为它最初似乎是可行的,但我最终选择了你的解决方案。我来这里不是为了要点,我来这里是为了看到世界不会燃烧。