You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:54:50