MongoDB Docker容器入口初始化脚本未执行问题求助
MongoDB Docker初始化脚本未执行问题求助
原帖在MongoDB社区论坛发布12小时未获回复,补充细节寻求帮助:
耗时一整天调试MongoDB的Docker部署始终失败,以下是配置及问题详情:
docker-compose.yml配置
services: app: build: ./app restart: unless-stopped env_file: "app/.env" ports: - 21865:21865 depends_on: mongo: condition: service_healthy networks: - mongo-network mongo: image: mongo:latest restart: unless-stopped ports: - 27017:27017 env_file: "mongo/.env" healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 10s timeout: 10s retries: 5 volumes: - ./mongo/data:/data/db - ./mongo/scripts:/docker-entrypoint-initdb.d/ networks: - mongo-network networks: mongo-network: driver: bridge
初始化脚本(mongo/scripts/init.js)
use db1; db.col1.insertOne({"exists": true}); db.createUser({ user: "<user>", pwd: "<pw>", roles: [ { role: "readWrite", db: "db1" } ] }); use db2; db.col2.insertOne({"exists": true}); db.createUser({ user: "<user>", pwd: "<pw>", roles: [ { role: "readWrite", db: "db2" } ] });
问题现象
- 启动Docker Compose后,以root用户执行
docker-compose exec -it mongo mongosh -u "root" -p登录,运行show databases仅显示admin、config、local,看不到db1和db2:test> show databases; admin 100.00 KiB config 12.00 KiB local 72.00 KiB - 应用尝试认证时持续失败,无论是否指定authSource均报错,日志片段:
docker-compose logs mongo | grep <user> docker-server-mongo-1 | {"t":{"$date":"2024-10-20T17:31:28.573+00:00"},"s":"I", "c":"ACCESS", "id":20251, "ctx":"conn300","msg":"Supported SASL mechanisms requested for unknown user","attr":{"user":{"user":"<user>","db":"<db1>"}}} docker-server-mongo-1 | {"t":{"$date":"2024-10-20T17:31:28.573+00:00"},"s":"I", "c":"ACCESS", "id":5286307, "ctx":"conn300","msg":"Failed to authenticate","attr":{"client":"192.168.160.3:44922","isSpeculative":true,"isClusterMember":false,"mechanism":"SCRAM-SHA-256","user":"<user>","db":"<db1>","error":"UserNotFound: Could not find user \"<user1>\" for db \"<db1>\"","result":11,"metrics":{"conversation_duration":{"micros":177,"summary":{"0":{"step":1,"step_total":2,"duration_micros":150}}}},"extraInfo":{}}} docker-server-mongo-1 | {"t":{"$date":"2024-10-20T17:31:28.575+00:00"},"s":"I", "c":"ACCESS", "id":5286307, "ctx":"conn300","msg":"Failed to authenticate","attr":{"client":"192.168.160.3:44922","isSpeculative":false,"isClusterMember":false,"mechanism":"SCRAM-SHA-1","user":"<user>","db":"<db1>","error":"UserNotFound: Could not find user \"<user>\" for db \"<db1>\"","result":11,"metrics":{"conversation_duration":{"micros":194,"summary":{"0":{"step":1,"step_total":2,"duration_micros":181}}}},"extraInfo":{}}} - 已确认MongoDB服务本地及应用容器内均可访问:
> curl localhost:27017 It looks like you are trying to access MongoDB over HTTP on the native driver port.> docker-compose exec -it app bash bash-5.2# curl mongo:27017 It looks like you are trying to access MongoDB over HTTP on the native driver port. - 日志显示MongoDB已识别到初始化脚本,但脚本中添加的
printjson({"This": "Works"})无任何输出:> docker-compose logs mongo | grep entrypoint docker-server-mongo-1 | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.js > docker-compose logs mongo | grep This >
解决方案
- 清理数据卷重新初始化:MongoDB的初始化脚本仅在首次创建数据库(
/data/db为空)时执行。若之前启动过容器,数据卷已有数据,脚本不会重复运行。执行:docker-compose down -v docker-compose up -d - 检查root用户环境变量:确认
mongo/.env中已设置MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD,初始化脚本需要root权限才能创建用户。 - 修改脚本添加错误捕获:给脚本加上异常捕获,输出执行过程中的错误,方便排查:
try { use db1; printjson(db.col1.insertOne({"exists": true})); printjson(db.createUser({ user: "<user>", pwd: "<pw>", roles: [ { role: "readWrite", db: "db1" } ] })); } catch (e) { printjson("db1初始化错误:" + e); } try { use db2; printjson(db.col2.insertOne({"exists": true})); printjson(db.createUser({ user: "<user>", pwd: "<pw>", roles: [ { role: "readWrite", db: "db2" } ] })); } catch (e) { printjson("db2初始化错误:" + e); } - 验证脚本文件权限:确保
init.js文件权限为容器可读,执行:chmod 644 ./mongo/scripts/init.js - 修正应用连接字符串:应用连接时需指定正确的
authSource,例如连接db1的用户,连接字符串格式应为:mongodb://<user>:<pw>@mongo:27017/db1?authSource=db1
内容的提问来源于stack exchange,提问作者LeopardL GD
相关产品推荐
相关产品推荐

