ToB企服应用市场:ToB评测及商务社交产业平台

标题: docker-compose mongo 启动mongo容器后如何执行脚本创建用户数据库问题 [打印本页]

作者: 傲渊山岳    时间: 2024-2-21 21:00
标题: docker-compose mongo 启动mongo容器后如何执行脚本创建用户数据库问题
系统版本:
  1. Docker version 20.10.7, build f0df350
  2. docker-compose version 1.29.2, build 5becea4c
复制代码
1.docker-compose文件和start.sh

环境变量:Linux下必须export声明两个环境变量,注意这个账户同时也是创建的数据库的连接用户密码
  1. export MONGO_INITDB_ROOT_USERNAME=<用户名>
  2. export MONGO_INITDB_ROOT_PASSWORD=<密码>
复制代码
目录:/home/user/docker-compose.yml
镜像:mongo:6.0.10
容器名:mongobss
挂载卷:data/db数据目录  start.sh后创建用户和库的脚本
环境变量:定义初始的mongo root角色用户
privileged:给予容器高权限
  1. version: '3'
  2. services:
  3.   mongodb:
  4.     image: mongo:6.0.10
  5.     container_name: mongobss
  6.     ports:
  7.         - 27017:27017
  8.     privileged: true
  9.     volumes:
  10.         - "./data/db:data/db"
  11.         - "./start.sh:/docker-entrypoint-initdb.d/start.sh"  #这里是关键点涉及到mongo官方打包镜像时定义的sh启动文件在3中讲解
  12.     environment:
  13.       - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
  14.       - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
  15.     tty: true
复制代码
 
目录:/home/user/start.sh
set -e:遇到错误shell不退出
mongosh:mongo高版本的命令行工具替代了原有的mongo,该脚本使用mongosh创建了初始的用户和库
  1. #!/bin/bash
  2. set -e
  3. echo "Creating database: <库名>"
  4. mongosh --username ${MONGO_INITDB_ROOT_USERNAME} --password ${MONGO_INITDB_ROOT_PASSWORD}  <<EOF
  5. use admin
  6. use <库名>
  7. db.createUser({
  8.   user:  "${MONGO_INITDB_ROOT_USERNAME}",
  9.   pwd: "${MONGO_INITDB_ROOT_PASSWORD}",
  10.   roles: [{ role: "readWrite", db: "<库名>" }]
  11. })
  12. EOF
复制代码
该脚本一共420行大多部分都是启动mongo进程的准备,主要关注的是最后几行,for循环读取/docker-entrypoint-initdb.d/ 该文件下的.sh .js格式脚本去执行,如果按照常规方法使用docker-compose的command字段会替换掉ENTRYPOINT 指定的启动文件也就无法启动mongo进程,但是采用 1 中volume挂载方式将脚本放入for指定的目录下,就会自动执行。
  1. cd /home/user
  2. export 用户变量
  3. export 密码变量
  4. //能联网
  5. docker pull mongo:6.0.10
  6. //内网环境
  7. //需要mongo 6.0.10的镜像tar, 一半网上找不到,可以在vmware中pull一个下来执行 docker save -o mongo.tar <镜像ID> 可以保存为tar包再上传到内网服务器
  8. docker load -i mongo.tar
  9. docker-compose up -d <br>//查看容器运行状态,测试中初始化的时长大概在40秒左右完成脚本执行,其他服务才能连上mongo,如果有其他服务连接mongo建议发起一个sleep等待这个时间<br>docker ps <br>dcoker logs -f monogobss<br>//成功的日志输出
复制代码
4.外部程序使用mongo:

java -jar启动jar包为例:
假设你的配置文件引用的是环境变量,要注意因为mongo容器启动时间较长我们主程序要等待mongo容器初始化完成在发起链接请求mongo,可以在服务的启动文件sleep 45秒左右
  1. https://github.com/docker-library/mongo/blob/master/docker-entrypoint.sh
复制代码
 
  1. b70ce161a9f4   mongo:6.0.10   <strong>"docker-entrypoint.s…"</strong>   2 hours ago   Up 2 hours   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   mongobss
复制代码
  1.                 export MONGO_INITDB_DATABASE="${MONGO_INITDB_DATABASE:-test}"
  2.                 echo
  3.                 for f in /docker-entrypoint-initdb.d/*; do
  4.                         case "$f" in
  5.                                 *.sh) echo "$0: running $f"; . "$f" ;;
  6.                                 *.js) echo "$0: running $f"; "${mongo[@]}" "$MONGO_INITDB_DATABASE" "$f"; echo ;;
  7.                                 *)    echo "$0: ignoring $f" ;;
  8.                         esac
  9.                         echo
  10.                 done
复制代码
 
 
 
 
 
 
 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4