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
排查及修复步骤
检查初始化脚本执行时机
MongoDB的初始化脚本仅在第一次创建数据卷并启动容器时执行。如果之前已经启动过MongoDB容器,mongodb_data卷可能已存在,导致脚本不会重复执行。执行以下命令清理卷后重新启动:docker-compose down -v docker-compose up -d验证脚本挂载状态
进入MongoDB容器,确认脚本是否存在于指定目录:docker-compose exec mongodb ls /docker-entrypoint-initdb.d/如果看不到脚本,说明挂载路径错误,检查
docker-compose.yml中./mongo-init/是否为项目根目录下的正确相对路径。查看容器日志确认脚本执行情况
检查MongoDB启动日志,确认脚本是否被执行:docker-compose logs mongodb日志中应包含
Executing /docker-entrypoint-initdb.d/mongo-init.js类的记录,若没有则说明脚本未被识别(比如文件名后缀不符合要求,仅.js/.sh/.json会被执行)。修正脚本权限逻辑
初始化阶段默认以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' });移除无效环境变量
MongoDB官方镜像不识别MONGO_URI环境变量,删除docker-compose.yml中该配置,避免潜在干扰。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

