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
相关产品推荐
相关产品推荐

