使用docker mongo创建一个新数据库并包含用户名密码(方式二)

有时在测试或新建测试项目后,需要一个简易的 mongo 数据库并带用户名和密码。 如果使用 mongo 语法命令会比较麻烦,主要目的是测试,重点不在 mongo 数据库的搭建上,这时使用 docker 就非常方便

实现目标

  1. mongo 数据库的管理账号: root 管理密码: root
  2. 新建一个mongo 数据库,数据库名: JJ
  3. 刚新建的数据库的账号: cms 密码: hello123456===
  4. mongo db 的端口号: 27017
  5. 以上密码 在版本控制器之外,独立出来

组织结构

1
2
3
4
5
6
7
8
9
10
.
|
├── data
|   ├── db
|   
├── docker-compose.yml
|   
├── init-mongo.sh
|   
└── dev.env

文件内容

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3.1'

services:
  mongo:
    image: mongo:3.6.18
    container_name: mongo_server
    env_file:
      - ${NODE_ENV}.env
    ports:
      - 27017:27017
    volumes:
      - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
      - ./data/db:/data/db

init-mongo.sh

1
2
3
4
5
6
7
8
9
10
mongo -- "$MONGO_INITDB_DATABASE" <<EOF
    var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
    var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
    var admin = db.getSiblingDB('admin');
    admin.auth(rootUser, rootPassword);

    var user = '$MONGO_INITDB_USERNAME';
    var passwd = '$MONGO_INITDB_PASSWORD';
    db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF

dev.env

1
2
3
4
5
6
# define env var default value.
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=root
MONGO_INITDB_DATABASE=JJ
MONGO_INITDB_USERNAME=cms
MONGO_INITDB_PASSWORD=hello123456===

我的 ubuntu 里设置了系统环境变量 NODE_ENV=dev, 所以运行的时候就会取 dev.env 文件

检查配置

1
docker-compose config

运行

1
docker-compose up

删除

1
docker-compose rm -f mongo_server

测试

可以使用 Studio 3T for mongoDB 进行连接测试

延申思考

init-mongo.sh 是mongo首次启动运行的脚本.那么如果需要初始化一些 mongo 基础数据表, 是不是不远了?

补充

配置不同场景下的环境变量

从这两中的方式中我们可以看到,docker compose 提供了足够的灵活性来让我们设置 docker-compose.yml 文件中引用的环境变量,它们的优先级如下:

  1. Compose file
  2. Shell environment variables
  3. Environment file
  4. Dockerfile
  5. Variable is not defined
    首先,在 docker-compose.yml 文件中直接设置的值优先级是最高的。
    然后是在当前 shell 中 export 的环境变量值。
    接下来是在环境变量文件中定义的值。
    再接下来是在 Dockerfile 中定义的值。
    最后还没有找到相关的环境变量就认为该环境变量没有被定义。