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

Docker容器中docker-entrypoint-initdb.d下JS脚本不生效问题

Docker Compose启动Mongo容器后初始化脚本未执行的解决方法

核心原因分析

MongoDB官方镜像的docker-entrypoint-initdb.d目录下的初始化脚本仅在容器首次启动且/data/db数据目录为空时执行。如果之前启动过容器,本地挂载的./.data/mongo目录已经存在MongoDB数据,后续启动容器时会跳过初始化流程,这是最常见的触发问题的原因。

分步解决方案

1. 重置数据目录(最可能解决问题)

  • 停止并删除Mongo容器:
    docker compose down mongo
    
  • 删除本地存储的Mongo数据目录:
    rm -rf ./.data/mongo
    
  • 重新构建并启动容器:
    docker compose up --build mongo
    
    此时/data/db为空,容器会自动执行docker-entrypoint-initdb.d下的脚本。

2. 检查脚本挂载与权限

  • 进入运行中的容器,确认脚本是否正确挂载:
    docker exec -it mongo_4.0 ls -l /docker-entrypoint-initdb.d/
    
    应能看到init-ossportal.js,且权限为可读(至少r--r--r--)。如果权限异常,可本地调整文件权限:
    chmod 644 ./mongo/docker-entrypoint-initdb.d/init-ossportal.js
    

3. 验证脚本本身的正确性

手动在容器内执行脚本,排查语法或认证问题:

docker exec -it mongo_4.0 mongo admin -u admin -p passwd /docker-entrypoint-initdb.d/init-ossportal.js

如果执行报错,根据提示修正脚本:

  • 确认db.auth的用户名密码与MONGO_INITDB_ROOT_USERNAME/MONGO_INITDB_ROOT_PASSWORD完全一致
  • 检查createUser的语法是否兼容MongoDB 4.0版本(当前脚本语法符合要求,但需确保参数无拼写错误)

额外优化建议

  • Dockerfile中已定义MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD,Compose中无需重复设置环境变量,避免冗余
  • 可在脚本末尾添加日志输出,方便验证执行结果:
    print("ossportal_admin 用户创建成功");
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:06:00