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

Docker Compose中MongoDB init.js初始化脚本未执行问题求助

MongoDB容器初始化脚本不执行问题排查

尝试通过docker-entrypoint-initdb.d目录下的init.js脚本为Docker Compose部署的MongoDB初始化数据,脚本已挂载到容器对应目录,但始终无法创建test数据库、haha集合及插入数据,通过mongo-express和API路由均无法查询到对应数据。以下是相关配置、代码及项目结构:

docker-compose.yml配置

version: '3.9'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    depends_on:
      - mongodb
      - rabbitmq
      - nginx

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro

  mongodb:
    image: mongo:latest
    ports:
      - "27017:27017"
    environment:
      # - MONGO_INITDB_DATABASE=test
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
      - MONGO_URI="mongodb://admin:admin@mongodb:27017/"
    volumes:
      - ./mongo-init/:/docker-entrypoint-initdb.d/:ro 
      - mongodb_data:/data/db

  mongo-express:
    image: mongo-express:latest
    ports:
      - "8081:8081"
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
      - ME_CONFIG_MONGODB_ADMINPASSWORD=admin
      - ME_CONFIG_MONGODB_SERVER=mongodb
      - ME_CONFIG_MONGODB_PORT=27017
      - ME_CONFIG_MONGODB_ENABLE_ADMIN=true
      - ME_CONFIG_BASICAUTH_USERNAME=admin
      - ME_CONFIG_BASICAUTH_PASSWORD=admin
    depends_on:
      - mongodb

  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    restart: always
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
      - RABBITMQ_DEFAULT_VHOST=/
    ports:
      - 15672:15672
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq

volumes:
  mongodb_data: 
  rabbitmq_data:

初始化脚本:/mongo-init/init.js

db = db.getSiblingDB('test');
db.createUser({
  user: 'test',
  pwd: 'test',
  roles: [
    {
      role: 'readWrite',
      db: 'test',
    },
  ],
});

db.createCollection('haha');

db.haha.insertOne({ name: 'haha' });

项目根目录结构

.
├── app 
│   └── app.py 
├── mongo-init
│   └── mongo-init.js 
├── Dockerfile 
├── docker-compose.yml 
├── nginx.conf 
├── pyproject.toml 
└── poetry.lock

排查及修复步骤

  1. 检查初始化脚本执行时机
    MongoDB的初始化脚本仅在第一次创建数据卷并启动容器时执行。如果之前已经启动过MongoDB容器,mongodb_data卷可能已存在,导致脚本不会重复执行。执行以下命令清理卷后重新启动:

    docker-compose down -v
    docker-compose up -d
    
  2. 验证脚本挂载状态
    进入MongoDB容器,确认脚本是否存在于指定目录:

    docker-compose exec mongodb ls /docker-entrypoint-initdb.d/
    

    如果看不到脚本,说明挂载路径错误,检查docker-compose.yml中./mongo-init/是否为项目根目录下的正确相对路径。

  3. 查看容器日志确认脚本执行情况
    检查MongoDB启动日志,确认脚本是否被执行:

    docker-compose logs mongodb
    

    日志中应包含Executing /docker-entrypoint-initdb.d/mongo-init.js类的记录,若没有则说明脚本未被识别(比如文件名后缀不符合要求,仅.js/.sh/.json会被执行)。

  4. 修正脚本权限逻辑
    初始化阶段默认以root用户admin身份操作,但可显式添加认证语句确保权限,修改后的脚本如下:

    db.getSiblingDB('admin').auth('admin', 'admin');
    db = db.getSiblingDB('test');
    db.createUser({
      user: 'test',
      pwd: 'test',
      roles: [{ role: 'readWrite', db: 'test' }]
    });
    db.createCollection('haha');
    db.haha.insertOne({ name: 'haha' });
    
  5. 移除无效环境变量
    MongoDB官方镜像不识别MONGO_URI环境变量,删除docker-compose.yml中该配置,避免潜在干扰。

内容的提问来源于stack exchange,提问作者Louis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:20:55