【问题标题】:How to make Azure App Service for containers "use" .env variables?如何使容器的 Azure 应用服务“使用”.env 变量?
【发布时间】:2021-05-19 20:15:43
【问题描述】:

我使用 Azure 应用服务从 Container Registries 中的 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,但我不确定如何将这些传递给容器。

【问题讨论】:

    标签: python azure docker azure-devops dotenv


    【解决方案1】:

    要从 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 的访问策略中,否则这些都不起作用 - https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references#granting-your-app-access-to-key-vault

    【讨论】:

    • 这实际上相当不错。因此,如果我有 6 个秘密,我会添加 6 个应用程序设置 - 每个秘密一个?
    • 我接受了第一个答案,因为它最初似乎可行,但我最终选择了您的解决方案。
    • 我来这里不是为了积分,我是来看看这个世界不会燃烧的。
    【解决方案2】:

    关于将变量传递给 Dockerfile,请查看我的回答 here

    请在from后面加上参数

    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 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
    

    【讨论】:

    • 我也发现了这个method,但是直接在代码中获取秘密是个坏主意吗?
    • 您可能会遇到的问题是您的秘密是否会以某种方式被记录下来。如果没有,那你就准备好了。如果您仅在脚本中使用,我的意思是获取秘密,传递它们并且它们是安全的 - 你很好。只需检查日志并尝试找到它们 - 这是最好的 idnicator。
    猜你喜欢
    • 2019-09-25
    • 2021-01-30
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多