You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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启动并完全就绪后,自动执行密钥写入操作,避免因服务未就绪导致的命令失败。

  1. 在项目根目录新建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
  1. 给脚本加执行权限:
chmod +x scripts/vault-init.sh
  1. 修改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文件,步骤如下:

  1. 在./volumes/config目录下创建init.json文件:
{
  "secrets": {
    "kv": {
      "springboot/db": {
        "username": "admin",
        "password": "dev_secret_123"
      },
      "springboot/api": {
        "api_key": "abcdef_xyz_123456"
      }
    }
  }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:17:12