Docker部署MongoDB容器首次崩溃,init-db.js未执行求助
问题排查与解决方案
1. 容器崩溃+脚本不执行的核心原因
首次启动崩溃是因为初始化脚本执行失败或Mongo初始化流程冲突;重启后脚本不跑是因为第一次崩溃后数据目录已生成部分文件,Mongo仅在**首次启动(数据目录为空)**时触发/docker-entrypoint-initdb.d/下的初始化脚本。
2. 分步修复
第一步:彻底清理残留数据
先完全删除容器和关联数据卷,确保下次启动是全新初始化:
sudo docker-compose down -v
第二步:修正init-db.js脚本逻辑
脚本必须符合Mongo Shell语法,且要遵循Mongo初始化顺序,示例正确写法(替换你的用户名密码):
// 切换到admin库,用root身份操作 db = db.getSiblingDB('admin'); // 验证root用户(需对应docker-compose里的ROOT账号配置) db.auth('root', '你的root密码'); // 创建apm数据库和读写用户 db = db.getSiblingDB('apm'); db.createUser({ user: 'apm_user', pwd: 'apm_password', roles: [{ role: 'readWrite', db: 'apm' }] }); // 预创建集合(可选) db.createCollection('你的集合名');
提示:如果docker-compose里没配置
MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD,Mongo会进入无认证模式,脚本里去掉db.auth()步骤即可,但生产环境务必开启认证。
第三步:检查docker-compose挂载配置
确保脚本正确挂载到Mongo容器的初始化目录,示例配置片段:
services: mongodb: image: mongo:latest environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: 你的root密码 MONGO_INITDB_DATABASE: apm volumes: - ./init-db.js:/docker-entrypoint-initdb.d/init-db.js:ro - mongodb_data:/data/db ports: - "27017:27017"
注意:
depends_on仅保证容器启动顺序,不确保Mongo服务就绪,Flask代码里要加连接重试逻辑。
第四步:重新启动并验证
执行启动命令:
sudo docker-compose up --build
启动后验证:
# 进入Mongo容器执行Shell sudo docker exec -it <你的Mongo容器名> mongosh -u root -p 你的root密码 # 切换到apm库 use apm # 查看用户 show users
同时观察Mongo容器日志,确认有Executing /docker-entrypoint-initdb.d/init-db.js的输出,无语法错误提示。
3. 额外注意点
- 确保
init-db.js文件权限可读:chmod 644 init-db.js - MongoDB 6.0+用
mongosh代替旧mongo命令,脚本尽量兼容新语法 - 用Mongo Compass连接时,要选择正确的认证源(创建用户的数据库或admin)
内容的提问来源于stack exchange,提问作者Ableds Gaming
相关产品推荐
相关产品推荐

