Docker Compose部署Vault服务后执行配置命令受阻求助
解决Docker Compose部署Vault后自动执行配置命令的问题
问题根源
vault server -dev是前台阻塞运行的服务进程,直接在command字段用&、;、&&拼接后续配置命令时,要么server后台运行后容器因主进程退出直接终止,要么后续命令要等server进程结束才执行——而server会一直运行,所以配置命令永远无法触发。
可行解决方案
方案1:自定义启动脚本(Entrypoint)
编写一个启动脚本,先后台启动Vault,等待服务就绪后执行配置,最后挂起等待主进程,确保容器不会退出。
- 创建
vault-init.sh脚本:
#!/bin/sh # 后台启动Vault服务 vault server -dev & VAULT_PID=$! # 轮询等待Vault服务就绪 until vault status >/dev/null 2>&1; do echo "Waiting for Vault to start..." sleep 2 done # 执行配置命令 vault secrets enable -path clickhouse/kv kv-v2 vault secrets enable -path clickhouse/transit transit # 等待主进程,防止容器退出 wait $VAULT_PID
- 给脚本添加执行权限:
chmod +x vault-init.sh
- 编写
docker-compose.yaml:
version: '3.8' services: vault: image: vault ports: - "8200:8200" environment: - VAULT_DEV_ROOT_TOKEN_ID=root - VAULT_ADDR=http://127.0.0.1:8200 volumes: - ./vault-init.sh:/vault-init.sh entrypoint: ["/bin/sh", "/vault-init.sh"] cap_add: - IPC_LOCK
方案2:使用初始化容器(推荐)
利用Docker Compose的初始化容器,在主Vault服务通过健康检查后执行配置,无需修改主容器的启动逻辑。
docker-compose.yaml示例:
version: '3.8' services: vault: image: vault ports: - "8200:8200" environment: - VAULT_DEV_ROOT_TOKEN_ID=root - VAULT_ADDR=http://0.0.0.0:8200 cap_add: - IPC_LOCK healthcheck: test: ["CMD", "vault", "status"] interval: 2s timeout: 5s retries: 5 vault-config: image: vault depends_on: vault: condition: service_healthy environment: - VAULT_ADDR=http://vault:8200 - VAULT_TOKEN=root command: > sh -c " vault secrets enable -path clickhouse/kv kv-v2; vault secrets enable -path clickhouse/transit transit; echo 'Vault configuration completed' "
注意事项
- 开发环境必须设置
VAULT_DEV_ROOT_TOKEN_ID,否则每次启动生成随机令牌,配置命令会因权限不足失败。 - 生产环境禁止使用
-dev模式,需配置持久化存储、TLS认证等,配置逻辑也要调整为安全的令牌认证方式。
内容的提问来源于stack exchange,提问作者Thadeu Melo
相关产品推荐
相关产品推荐

