如何为容器 "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
我已经从容器注册表中的 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