docker-compose mongo 启动mongo容器后如何执行脚本创建用户数据库问题

这篇具有很好参考价值的文章主要介绍了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

 文章来源地址https://www.toymoban.com/news/detail-760193.html

目录:/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

2.启动容器:

目录:/home/user

命令:

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 
//查看容器运行状态,测试中初始化的时长大概在40秒左右完成脚本执行,其他服务才能连上mongo,如果有其他服务连接mongo建议发起一个sleep等待这个时间
docker ps
dcoker logs -f monogobss
//成功的日志输出

{"t":{"$date":"2023-12-16T04:42:41.548+00:00"},"s":"I", "c":"STORAGE", "id":22262, "ctx":"initandlisten","msg":"Timestamp monitor starting"}
{"t":{"$date":"2023-12-16T04:42:41.550+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"/tmp/mongodb-27017.sock"} }
{"t":{"$date":"2023-12-16T04:42:41.550+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"0.0.0.0"}}
{"t":{"$date":"2023-12-16T04:42:41.550+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
{"t":{"$date":"2023-12-16T04:42:44.816+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"192.168.208.3:51104","uuid":"66225b3a-525e-450c-9d2b-a97d3bf173c9","connectionId":1,"connectionCount":1}}

3.docker-entrypoint-initdb.d作用:

mongo官方ENTRYPOINT容器入口文件:

https://github.com/docker-library/mongo/blob/master/docker-entrypoint.sh

这是在mongo官方文档查到的他们在构建镜像时 ENTRYPOINT 指定的容器启动端口文件docker-entrypoint.sh,当docker启动mongo容器时mongo首先会执行该这个脚本。

b70ce161a9f4   mongo:6.0.10   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   mongobss

该脚本一共420行大多部分都是启动mongo进程的准备,主要关注的是最后几行,for循环读取/docker-entrypoint-initdb.d/ 该文件下的.sh .js格式脚本去执行,如果按照常规方法使用docker-compose的command字段会替换掉ENTRYPOINT 指定的启动文件也就无法启动mongo进程,但是采用 1 中volume挂载方式将脚本放入for指定的目录下,就会自动执行。

                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

4.外部程序使用mongo:

java -jar启动jar包为例:

假设你的配置文件引用的是环境变量,要注意因为mongo容器启动时间较长我们主程序要等待mongo容器初始化完成在发起链接请求mongo,可以在服务的启动文件sleep 45秒左右

[root@ config]# vi application.properties 
spring.data.mongodb.uri=${SPRING_DATA_MONGODB_URI}

 

这是docker-compose启动服务容器时环境变量的写法:要注意这个compose文件有两个容器 1 mongo的container_name=mongodb 2 jar包的应用程序,根据docker网络的特性可以直接使用hostname引用mongo 
environment:
      - SPRING_DATA_MONGODB_URI=mongodb://${MONGO_INITDB_ROOT_USERNAME}:${MONGO_INITDB_ROOT_PASSWORD}@mongodb:27017/BSStructure

 

 

 

 

 

 

 

到了这里,关于docker-compose mongo 启动mongo容器后如何执行脚本创建用户数据库问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 使用docker-compose 搭建mongo单节点与副本集

    注:确认已经已经关闭防火墙和selinux和已安装docker mkdir -p /data/mongodb vim /data/mongodb/mongo.yml vim /data/mongo/start_mongodb.sh 常用命令使用文档: https://www.runoob.com/mongodb/mongodb-tutorial.html vim /data/mongodb/mongodb.yml 2.2.1 登录容器 2.2.2 初始化集群 2.2.2.1添加配置文件 2.2.2.2初始化副本集mongo

    2024年01月22日
    浏览(29)
  • 【QA】docker-compose-部署django-如何设置自动启动

    使用docker-compose部署django项目,通常做法是: 构建docker镜像 运行容器 进入容器里面启动django项目 但是这样不够自动化。 尝试通过配置脚本的方式,让容器启动的时候就启动django项目,但这样往往使得容器一直处于重启状态,容器无法运行,本文主要解决这个问题 docker-com

    2024年01月23日
    浏览(12)
  • Docker容器:Docker-Compose

    Docker容器:Docker-Compose

    一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天是介绍 Docker 官方产品 Docker Compose 。 docker swarm(管理跨节点)。 Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(Y

    2024年02月11日
    浏览(15)
  • docker笔记9:Docker-compose容器编排

    docker笔记9:Docker-compose容器编排

    目录 1.是什么? 2. 能干嘛? 3.去哪下? 4.安装步骤  ​编辑 5.卸载步骤   6.Compose核心概念  6.1概念 6.2 Compose常用命令   7.Compose编排微服务 7.1改造升级微服务工程docker_boot 7.2不用Compose 7.2.1 单独的mysql容器实例 7.3 swagger测试 7.4上面成功了,有哪些问题? 7.5 使用Compose  7.5.1

    2024年02月09日
    浏览(10)
  • 【docker-compose】解决容器时区问题

            容器内时间比服务器慢8小时         容器时区默认 UTC 0          docker-compose.yaml 中设置时区

    2024年02月12日
    浏览(13)
  • docker-compose 构建 Kafka 容器

    在终端中创建一个名为 kafka 的目录,并进入该目录: 创建一个名为 docker-compose-kafka.yml 的文件并打开它。将以下代码复制到文件中: 这份配置使用了 Docker Compose,定义了两个服务 Zookeeper 和 Kafka。 Zookeeper 服务定义: 使用 wurstmeister/zookeeper 镜像; 将容器的 2181 端口映射到宿

    2024年02月10日
    浏览(11)
  • docker-compose容器编排使用详解+示例

    docker-compose容器编排使用详解+示例

    Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启

    2023年04月22日
    浏览(14)
  • Docker容器与虚拟化技术:Docker-Compose

    Docker容器与虚拟化技术:Docker-Compose

    目录 一、理论 1.Docker-Compose 二、实验 1. Docker Compose 安装部署 2.Docker Compose撰写nginx 镜像 3.Docker Compose撰写tomcat 镜像 三、问题 1.Docker Compose 和 Dockerfile 的区别 四、总结 (1)使用场景 使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务

    2024年02月12日
    浏览(10)
  • 【云原生】Docker-compose单机容器集群编排

    【云原生】Docker-compose单机容器集群编排

    Compose是单机编排容器集群或者是分布式服务容器的应用工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。 Docker-Compose是一个容器编排工具。通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、

    2024年02月09日
    浏览(17)
  • docker-compose启动minio

    docker-compose启动minio

    一、创建文件夹 二、docker-compose.yml 注意:新版 :RELEASE.2023-03-24T21-41-23Z 数据格式是这种 老版: RELEASE.2022-05-26T05-48-41Z 三、开启防火墙 四、验证 172.50.2.40:9001

    2024年02月16日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包