ToB企服应用市场:ToB评测及商务社交产业平台
标题:
docker-compose mongo 启动mongo容器后如何执行脚本创建用户数据库问题
[打印本页]
作者:
傲渊山岳
时间:
2024-2-21 21:00
标题:
docker-compose mongo 启动mongo容器后如何执行脚本创建用户数据库问题
系统版本:
Docker version 20.10.7, build f0df350
docker-compose version 1.29.2, build 5becea4c
复制代码
1.docker-compose文件和start.sh
环境变量:Linux下必须export声明两个环境变量,注意这个账户同时也是创建的数据库的连接用户密码
export MONGO_INITDB_ROOT_USERNAME=<用户名>
export MONGO_INITDB_ROOT_PASSWORD=<密码>
复制代码
目录:/home/user/docker-compose.yml
镜像:mongo:6.0.10
容器名:mongobss
挂载卷:data/db数据目录 start.sh后创建用户和库的脚本
环境变量:定义初始的mongo root角色用户
privileged:给予容器高权限
version: '3'
services:
mongodb:
image: mongo:6.0.10
container_name: mongobss
ports:
- 27017:27017
privileged: true
volumes:
- "./data/db:data/db"
- "./start.sh:/docker-entrypoint-initdb.d/start.sh" #这里是关键点涉及到mongo官方打包镜像时定义的sh启动文件在3中讲解
environment:
- MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
tty: true
复制代码
目录:/home/user/start.sh
set -e:遇到错误shell不退出
mongosh:mongo高版本的命令行工具替代了原有的mongo,该脚本使用mongosh创建了初始的用户和库
#!/bin/bash
set -e
echo "Creating database: <库名>"
mongosh --username ${MONGO_INITDB_ROOT_USERNAME} --password ${MONGO_INITDB_ROOT_PASSWORD} <<EOF
use admin
use <库名>
db.createUser({
user: "${MONGO_INITDB_ROOT_USERNAME}",
pwd: "${MONGO_INITDB_ROOT_PASSWORD}",
roles: [{ role: "readWrite", db: "<库名>" }]
})
EOF
复制代码
该脚本一共420行大多部分都是启动mongo进程的准备,主要关注的是最后几行,for循环读取
/docker-entrypoint-initdb.d/
该文件下的.sh .js格式脚本去执行,如果按照常规方法使用docker-compose的command字段会替换掉ENTRYPOINT 指定的启动文件也就无法启动mongo进程,但是采用 1 中volume挂载方式将脚本放入for指定的目录下,就会自动执行。
cd /home/user
export 用户变量
export 密码变量
//能联网
docker pull mongo:6.0.10
//内网环境
//需要mongo 6.0.10的镜像tar, 一半网上找不到,可以在vmware中pull一个下来执行 docker save -o mongo.tar <镜像ID> 可以保存为tar包再上传到内网服务器
docker load -i mongo.tar
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秒左右
https://github.com/docker-library/mongo/blob/master/docker-entrypoint.sh
复制代码
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
复制代码
export MONGO_INITDB_DATABASE="${MONGO_INITDB_DATABASE:-test}"
echo
for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.js) echo "$0: running $f"; "${mongo[@]}" "$MONGO_INITDB_DATABASE" "$f"; echo ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4