在Podman中通过Secret传递MongoDB root密码失败的问题
解决Podman中使用Secret传递MongoDB初始化密码失败的问题
问题重现
- 创建密钥命令:
podman secret create mongodb-pw PASSWORDFILE - 容器启动命令示例:
podman run -d \ --name mongodb \ --secret mongodb-pw,env=MONGODB_INITDB_ROOT_PASSWORD \ -e MONGODB_INITDB_ROOT_USERNAME=root \ mongo:latest - 容器初始化报错:
Could not create admin user during database initialization.
Take a look at your mongod configuration to see if something is wrong.
问题根因
Podman用--secret映射的环境变量,实际存储的是容器内秘密文件的路径,而非直接的密码值。虽然你能通过echo $MONGODB_INITDB_ROOT_PASSWORD看到密码(这是Shell自动读取文件内容输出的结果),但MongoDB的初始化脚本不会主动读取该路径下的文件,它会把环境变量里的路径字符串直接当作密码使用,导致密码无效,创建管理员用户失败。
而用-e参数直接传递时,环境变量的值就是明文密码,初始化脚本能正确识别。
解决方案
需要手动读取秘密文件内容,再赋值给MongoDB的初始化环境变量,以下两种方法均可:
方法一:直接通过Shell命令读取启动
podman run -d \ --name mongodb \ --secret mongodb-pw \ -e MONGODB_INITDB_ROOT_USERNAME=root \ --entrypoint /bin/sh \ mongo:latest \ -c 'export MONGODB_INITDB_ROOT_PASSWORD=$(cat /run/secrets/mongodb-pw); exec docker-entrypoint.sh mongod'
方法二:自定义启动脚本(更易维护)
- 本地创建
custom-entrypoint.sh脚本:#!/bin/sh if [ -f /run/secrets/mongodb-pw ]; then export MONGODB_INITDB_ROOT_PASSWORD=$(cat /run/secrets/mongodb-pw) fi exec docker-entrypoint.sh "$@" - 给脚本添加执行权限:
chmod +x custom-entrypoint.sh - 挂载脚本并启动容器:
podman run -d \ --name mongodb \ --secret mongodb-pw \ -e MONGODB_INITDB_ROOT_USERNAME=root \ -v ./custom-entrypoint.sh:/custom-entrypoint.sh \ --entrypoint /custom-entrypoint.sh \ mongo:latest
验证
容器启动后,进入容器执行echo $MONGODB_INITDB_ROOT_PASSWORD可看到正确密码,同时用mongosh -u root -p <密码>能正常登录数据库。
内容的提问来源于stack exchange,提问作者raywib
相关产品推荐
相关产品推荐

