docker-compose用secrets部署Metabase+PostgreSQL后无法连接导出备份
问题根因
官方PostgreSQL Docker镜像的POSTGRES_USER、POSTGRES_PASSWORD环境变量默认直接传入参数值作为用户名/密码,你配置时直接填写了secret文件路径,数据库初始化时超级用户被创建为字符串/run/secrets/db_user,默认的postgres角色并没有生成,所以你使用root、postgres用户登录都会报角色不存在错误。
解决方案
步骤1:获取真实的用户名密码
进入PostgreSQL容器读取secret文件的实际内容:
docker-compose exec postgres-secrets bash # 读取实际用户名 cat /run/secrets/db_user # 读取实际密码 cat /run/secrets/db_password
步骤2:导出数据库备份
你可以选择两种方式导出:
- 容器内导出:
pg_dump -U $(cat /run/secrets/db_user) -d metabase -f /tmp/metabase_backup.sql
执行时输入刚才读取到的密码即可,导出的备份文件存放在容器的/tmp/metabase_backup.sql路径,你可以用docker cp命令复制到宿主机。
- 宿主机直接导出(更便捷):
直接在宿主机执行以下命令,备份文件会直接生成在当前工作目录:
docker-compose exec -T postgres-secrets pg_dump -U "$(cat db_user.txt)" -d metabase > metabase_backup.sql
(可选)修复配置避免后续问题
PostgreSQL 14及以上版本的官方镜像支持*_FILE后缀的环境变量,会自动读取对应路径文件的内容作为配置值,你可以修改docker-compose中postgres服务的环境变量部分:
environment: POSTGRES_USER_FILE: /run/secrets/db_user POSTGRES_DB: metabase POSTGRES_PASSWORD_FILE: /run/secrets/db_password
修改后重启服务即可,后续可以直接用secret文件中存储的用户名登录操作数据库。
内容的提问来源于stack exchange,提问作者Mauro
相关产品推荐
相关产品推荐

