Hashicorp Vault容器重启Docker Compose后本地卷未保存秘钥问题
Hashicorp Vault容器数据持久化问题解决方法
你的问题根源很明确:你用的是Vault的开发模式(vault server -dev),这个模式是为快速测试设计的,所有数据默认存在内存里,哪怕你挂载了vault-file卷,开发模式也不会把数据写入到磁盘目录,所以docker-compose down后内存里的数据直接丢失。
要解决持久化问题,必须放弃开发模式,改用生产模式配置,让Vault将数据写入挂载的卷中。下面是具体步骤:
1. 修改docker-compose.yml配置
去掉开发模式相关的环境变量(VAULT_DEV_*),改用生产模式启动,并指定文件存储后端。这里提供两种配置方式:
方式一:使用配置文件(推荐,更灵活)
先在本地创建vault-config目录,然后创建vault-config/config.hcl配置文件,内容如下:
storage "file" { path = "/vault/file" # 对应挂载的卷目录 } listener "tcp" { address = "0.0.0.0:8200" tls_disable = 1 # 测试环境临时关闭TLS,生产环境务必开启 } ui = true # 可选,开启Web UI方便操作
然后修改docker-compose.yml:
version: '3.7' services: vault: image: vault:latest volumes: - vault-file:/vault/file - ./vault-config:/vault/config ports: - "8200:8200/tcp" environment: VAULT_ADDR: 'http://0.0.0.0:8200' cap_add: - IPC_LOCK container_name: vault entrypoint: "vault server -config=/vault/config/config.hcl" volumes: vault-file: {}
方式二:直接在启动命令中指定存储后端(快速测试用)
如果不想写配置文件,可以直接修改entrypoint,让Vault用文件存储启动:
version: '3.7' services: vault: image: vault:latest volumes: - vault-file:/vault/file ports: - "8200:8200/tcp" cap_add: - IPC_LOCK container_name: vault entrypoint: "vault server -storage-file=/vault/file -listener=tcp://0.0.0.0:8200 -tls-disable=1" volumes: vault-file: {}
2. 启动后的必要操作
生产模式下Vault不会自动初始化,启动容器后需要手动完成初始化和unseal:
- 进入容器:
docker exec -it vault sh - 初始化Vault:
vault operator init执行后会生成5个 unseal 密钥和1个根令牌,务必把这些信息保存好,丢失的话数据无法恢复
- 执行unseal(需要用3个不同的密钥):
vault operator unseal <第一个密钥> vault operator unseal <第二个密钥> vault operator unseal <第三个密钥> - 登录Vault:
vault login <根令牌>
之后再存入密钥,执行docker-compose down再启动,数据就会保存在vault-file卷中不会丢失了。
额外提示
- 开发模式(
-dev)仅适合临时测试,绝对不能用于需要持久化数据的场景 - 如果只是想临时测试开发模式下的持久化,可以添加
-dev-storage-dir=/vault/file参数,让开发模式把数据写到指定目录,但这依然不是生产环境的正确用法 - 生产环境建议使用更可靠的存储后端(比如Consul、云存储),并配置自动unseal(如AWS KMS、Azure Key Vault)
内容的提问来源于stack exchange,提问作者Eduardo Nicolalde
相关产品推荐
相关产品推荐

