使用Docker Compose启动时从Azure Key Vault获取密钥的正确方法?
从Azure Key Vault获取密钥到Docker Compose的方案
针对你的场景(Azure VM与Key Vault同虚拟网络),有几种简洁安全的方案可以替代手动输入密钥,以下是具体实现方式:
方案1:环境变量插值+Azure CLI(快速实现)
Docker Compose支持读取系统环境变量,你可以先通过Azure CLI从Key Vault取出密钥并设为环境变量,再让Compose加载这个变量:
- 确保VM已安装Azure CLI,且当前用户/VM有权访问Key Vault,执行命令导出密钥到环境变量:
export PGSQL_PSWD=$(az keyvault secret show --name <你的密码密钥名称> --vault-name <你的Key Vault名称> --query value -o tsv)
- 修改docker-compose.yml,用
${变量名}引用环境变量:
version: '2' services: backend: image: myimage:0.1 restart: unless-stopped ports: - 2300:2300 environment: - PGSQL_HOST=mydns.postgres.database.azure.com - PGSQL_PORT=5432 - PGSQL_USERNAME=postgres@mypostgres - PGSQL_PSWD=${PGSQL_PSWD}
- 正常执行
docker compose up -d即可,Compose会自动读取环境变量填充配置。
方案2:.env文件管理(适合多密钥场景)
如果需要管理多个密钥,用.env文件更直观:
- 执行命令将密钥写入
.env文件(注意不要把此文件提交到版本控制):
echo "PGSQL_PSWD=$(az keyvault secret show --name <你的密码密钥名称> --vault-name <你的Key Vault名称> --query value -o tsv)" > .env
- docker-compose.yml配置和方案1一致,Compose会自动加载当前目录下的
.env文件,直接执行docker compose up -d即可。
方案3:Azure Managed Identity(最安全,无手动凭证)
因为服务部署在Azure VM上,推荐用托管标识实现无密钥访问Key Vault,避免手动登录CLI或存储凭证:
给VM分配系统托管标识:
- 在Azure Portal找到你的VM,进入「身份」选项卡,启用系统分配的标识。
给标识授权访问Key Vault:
- 进入Key Vault的「访问策略」选项卡,添加新策略,选择「密钥权限」中的「获取」,再选择VM的系统托管标识作为主体。
在VM上配置Azure CLI用托管标识登录:
az login --identity
- 写一个启动脚本
start.sh自动获取密钥并启动服务:
#!/bin/bash export PGSQL_PSWD=$(az keyvault secret show --name <你的密码密钥名称> --vault-name <你的Key Vault名称> --query value -o tsv) docker compose up -d
给脚本加执行权限chmod +x start.sh,之后运行./start.sh即可启动服务,全程无需手动输入凭证。
关于直接在docker-compose中插入密钥的说明
Docker Compose本身不支持直接在配置文件中执行Azure CLI命令动态拉取密钥,无法直接在PGSQL_PSWD:后写命令。必须通过环境变量或脚本先获取密钥,再让Compose读取。
内容的提问来源于stack exchange,提问作者erni
相关产品推荐
相关产品推荐

