使用Docker Compose Secrets无法认证MongoDB的问题求助
无法通过Docker Compose Secrets连接MongoDB的排查与解决
我配置了Docker Compose的Secrets功能管理MongoDB根凭证,但无法使用凭证文件中的账号密码连接MongoDB。
我的docker-compose.yml配置
version: '3.4' services: mongo-container: network_mode: host image: mongo:6.0.5 environment: MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongodb_root_password MONGO_INITDB_ROOT_USERNAME_FILE: /run/secrets/mongodb_root_username secrets: - mongodb_root_password - mongodb_root_username volumes: - "/storage/docker/mongodb:/data/db" command: mongod secrets: mongodb_root_password: file: /home/mongodb/.mongodb_root_password mongodb_root_username: file: /home/mongodb/.mongodb_root_username
操作步骤与现象
在docker-compose.yml所在目录执行docker-compose up -d启动容器:
- 硬编码凭证的连接字符串可正常连接:
mongodb://admin:pass@host:27017/?authMechanism=DEFAULT - 使用Secrets文件中
<username>和<password>的连接字符串无法连接:mongodb://<username>:<password>@host:27017/?authMechanism=DEFAULT
Secrets文件内容
$ cat /home/mongodb/.mongodb_root_password <password> $ cat /home/mongodb/.mongodb_root_username <username>
排查与解决方法
- 清理凭证文件的换行符:绝大多数情况是凭证文件末尾的换行符被MongoDB当成了密码/用户名的一部分。用
cat -A查看文件,若末尾有$符号说明存在换行符。执行以下命令去除:tr -d '\n' < /home/mongodb/.mongodb_root_password > temp && mv temp /home/mongodb/.mongodb_root_password tr -d '\n' < /home/mongodb/.mongodb_root_username > temp && mv temp /home/mongodb/.mongodb_root_username - 验证容器内的Secrets内容:进入容器检查Secrets文件的实际内容,确认无多余字符:
docker exec -it mongo-container cat /run/secrets/mongodb_root_password docker exec -it mongo-container cat /run/secrets/mongodb_root_username - 修正文件权限:确保Docker能读取Secrets文件,设置正确权限:
chmod 600 /home/mongodb/.mongodb_root_password /home/mongodb/.mongodb_root_username - 检查MongoDB启动日志:查看容器日志排查初始化错误:
docker logs mongo-container - 重新初始化数据库:如果之前用硬编码密码启动过容器,本地数据卷已存在旧用户数据。需清理后重新初始化:
docker-compose down rm -rf /storage/docker/mongodb docker-compose up -d
内容的提问来源于stack exchange,提问作者Harry Stuart
相关产品推荐
相关产品推荐

