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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:26:11