如何在Docker中启动带有预置KV密钥的HashiCorp Vault
问题描述
我正在为Spring Boot微服务搭配HashiCorp Vault构建Docker Compose开发环境,希望执行docker compose up就能直接启动一套配置完整的环境,包含已知的Vault根令牌和预先设置好的KV密钥。目前我的Vault服务配置如下:
vault: image: "vault" ports: - "8200:8200" expose: - "8200" restart: always volumes: - ./volumes/config:/vault/config cap_add: - IPC_LOCK environment: - "VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200" #entrypoint: vault server --config /vault/config/vault.json entrypoint: vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000"
想问问在这个配置里,怎么最方便地预置KV密钥?
解决方案
推荐几种实用的方式,其中自定义启动脚本的方式最灵活可靠,适合大多数开发场景:
方式一:自定义启动脚本(首推)
这种方式会在Vault启动并完全就绪后,自动执行密钥写入操作,避免因服务未就绪导致的命令失败。
- 在项目根目录新建
scripts文件夹,创建vault-init.sh脚本:
#!/bin/sh # 后台启动Vault服务 vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000" & VAULT_PID=$! # 循环检测Vault是否就绪,直到能正常连接 until vault status > /dev/null 2>&1; do echo "等Vault启动好..." sleep 2 done # 设置Vault的环境变量,避免每次命令都要指定 export VAULT_TOKEN="00000000-0000-0000-0000-000000000000" export VAULT_ADDR="http://localhost:8200" # 启用KV引擎(默认是v2版本,如果需要v1,加参数 `-version=1`) vault secrets enable kv # 写入你需要的预置密钥,这里举Spring Boot配置的例子 vault kv put kv/springboot/db username=admin password=dev_secret_123 vault kv put kv/springboot/api api_key=abcdef_xyz_123456 # 保持Vault前台运行,避免容器退出 wait $VAULT_PID
- 给脚本加执行权限:
chmod +x scripts/vault-init.sh
- 修改Docker Compose配置,挂载脚本并替换entrypoint:
vault: image: "vault" ports: - "8200:8200" expose: - "8200" restart: always volumes: - ./volumes/config:/vault/config - ./scripts/vault-init.sh:/vault/scripts/vault-init.sh # 挂载启动脚本 cap_add: - IPC_LOCK environment: - "VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200" entrypoint: /vault/scripts/vault-init.sh
方式二:直接在Docker Compose的command里写命令
如果场景简单,不想单独写脚本,可以直接在compose里用shell命令串联操作,不过这种方式用固定sleep时间等待启动,不如脚本可靠:
vault: image: "vault" ports: - "8200:8200" expose: - "8200" restart: always volumes: - ./volumes/config:/vault/config cap_add: - IPC_LOCK environment: - "VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200" - VAULT_TOKEN=00000000-0000-0000-0000-000000000000 - VAULT_ADDR=http://localhost:8200 command: > sh -c " # 后台启动Vault vault server --dev --dev-root-token-id=$VAULT_TOKEN & # 等5秒确保服务起来 sleep 5 && # 启用KV引擎并写入密钥 vault secrets enable kv && vault kv put kv/springboot/db username=admin password=dev_secret_123 && # 保持容器运行 wait "
方式三:用Vault dev模式的初始化文件(Vault 1.10+可用)
如果你的Vault镜像版本在1.10以上,可以直接用--dev-init-path参数加载预置密钥的JSON文件,步骤如下:
- 在
./volumes/config目录下创建init.json文件:
{ "secrets": { "kv": { "springboot/db": { "username": "admin", "password": "dev_secret_123" }, "springboot/api": { "api_key": "abcdef_xyz_123456" } } } }
- 修改Docker Compose的entrypoint,添加初始化文件参数:
vault: image: "vault" ports: - "8200:8200" expose: - "8200" restart: always volumes: - ./volumes/config:/vault/config cap_add: - IPC_LOCK environment: - "VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200" entrypoint: vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000" --dev-init-path=/vault/config/init.json
内容的提问来源于stack exchange,提问作者Tuomas Toivonen
相关产品推荐
相关产品推荐

