如何为容器 "use" .env 变量制作 Azure App Service?

How to make Azure App Service for containers "use" .env variables?

我已经从容器注册表中的 docker 容器使用 Azure 应用服务部署了一个 Python 网络应用程序。在我的应用程序中,我使用 dotenv 来加载机密,并且在本地我 运行 docker run --env-file=.env my-container 传递 .env 变量,但我无法真正弄清楚部署到时该怎么做蔚蓝?

我通过以下方式使用 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

然后运行像这样

- task: Docker@2
  inputs:
    containerRegistry: 'devopsmanual-acr'
    command: 'build'
    Dockerfile: 'Whosebug/85-docker/DOCKERFILE'
    arguments: '--build-arg a_version=$(SERVER_NAME)'

就从 KeyVault 获取值而言,您可以使用 Azure Key Vault task

# Azure Key Vault
# Download Azure Key Vault secrets
- task: AzureKeyVault@1
  inputs:
    azureSubscription: 
    keyVaultName: 
    secretsFilter: '*'
    runAsPreJob: false # Azure DevOps Services only

请注意,默认情况下,此任务创建的变量被标记为机密,因此它们不会映射到环境变量。

You can still try to use your approach but first you need to map it.

- 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

要从 Key Vault 获取机密并将它们用作应用中的环境变量,请使用此处所述的 Key Vault 引用: https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references

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

@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)

就是这样。无需修改您的 dotenv 代码来执行任何特殊操作,因为应用服务已经将应用设置作为环境变量注入到您的应用中。

不要忘记将您的应用服务实例(托管标识)添加到 Key Vault 的访问策略中,否则 none 这有效 - https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references#granting-your-app-access-to-key-vault