我已经在container Registry中的docker容器中使用Azure app Service部署了一个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密钥库,但我不确定如何将这些机密传递到容器。
在将变量传递到Dockerfile方面,请在此处检查我的答案
请在的后面添加参数
FROM alpine
ARG serverName
RUN echo $serverName
然后像这个一样运行
- task: Docker@2
inputs:
containerRegistry: 'devopsmanual-acr'
command: 'build'
Dockerfile: 'stackoverflow/85-docker/DOCKERFILE'
arguments: '--build-arg a_version=$(SERVER_NAME)'
在从KeyVault获取值方面,您可以使用Azure密钥库任务
# Azure Key Vault
# Download Azure Key Vault secrets
- task: AzureKeyVault@1
inputs:
azureSubscription:
keyVaultName:
secretsFilter: '*'
runAsPreJob: false # Azure DevOps Services only
请注意,通过deault,此任务创建的变量被标记为机密,因此它们不会映射到环境变量。
你仍然可以尝试使用你的方法,但首先你需要绘制它。
- powershell: |
Write-Host "Using an input-macro works: $(mySecret)"
Write-Host "Using the env var directly does not work: $env:MYSECRET"
Write-Host "Using a global secret var mapped in the pipeline does not work either: $env:GLOBAL_MYSECRET"
Write-Host "Using a global non-secret var mapped in the pipeline works: $env:GLOBAL_MY_MAPPED_ENV_VAR"
Write-Host "Using the mapped env var for this task works and is recommended: $env:MY_MAPPED_ENV_VAR"
env:
MY_MAPPED_ENV_VAR: $(mySecret) # the recommended way to map to an env variable
要从密钥库中获取机密并将其用作应用程序中的env-var,请使用密钥库参考,如下所述:https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references
然后只需将引用添加到您的应用程序设置中。例如:
@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)
就是这样。不需要修改您的dotenv代码来做任何特殊的事情,因为应用程序设置已经被应用程序服务作为环境变量注入到您的应用程序中。
不要忘记将您的应用程序服务实例(托管身份(添加到密钥保管库的访问策略中,否则这些都不起作用-https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references#granting-您的应用程序访问密钥库