如何使用docker-compose在mongodb中创建用户

jOH*_*dOE 30 mongodb docker docker-compose

我正在尝试创建某种脚本,它将使用mongodb创建一个docker并自动创建一个用户.

我通常可以使用docker-compose管理我的docker图像,但这一次,我不知道该怎么做.

基本上,这是我必须做的:

  1. 清理/销毁容器(docker-compose down)
  2. 使用mongodb创建一个docker容器并启动它(不带--auth parameter)
  3. 执行包含的java脚本 db.createUser()
  4. 停止容器
  5. 使用--auth参数重新启动相同的容器,以允许使用在javascript中创建的用户进行登录

我找不到如何用docker-compose正确地做到这一点,因为当它开始时,我必须给它命令--auth.如果我这样做,我就无法执行我的javascript来添加我的用户.如果没有用户且未提供--auth参数,MongoDB允许用户创建而无需登录.

我想自动执行此操作,我不想手动执行某些命令.目标是在每次集成测试之前创建一个可以从干净的数据库启动的脚本.

这是我的项目:

集成测试/ src目录/测试/资源/脚本/泊坞窗,compose.yml

mongodb:
    container_name: mongo
    image: mongo
  ports:
    - "27017:27017"
  volumes:
    - .:/setup
  command: --auth
Run Code Online (Sandbox Code Playgroud)

集成测试/ src目录/测试/资源/脚本/ docker-init.sh

docker-compose down
docker-compose up -d
sleep 1
docker exec mongo bash -c "mongo myDatabase /setup/mongodb-setup.js"
Run Code Online (Sandbox Code Playgroud)

集成测试/ src目录/测试/资源/脚本/ MongoDB的-setup.js

db.createUser(
{
    user: "myUser",
    pwd: "myPassword",
    roles: [
      { role: "readWrite", db: "myDatabase" }
    ]
})
Run Code Online (Sandbox Code Playgroud)

找到一种方法再次启动一个带有新参数的容器(在这种情况下--auth)会有所帮助,但我找不到如何做到这一点(docker start不接受参数).

知道我应该怎样做我想做的事吗?

如果没有,我仍然可以使用一些Java代码或其他东西从我的数据库中删除所有内容,但我希望使用脚本创建一个完整的mongodb docker设置.

jzq*_*zqa 26

官方mongo映像现在支持以下环境变量,可以在docker-compose中使用,如下所示:

environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=password
      - MONGO_INITDB_DATABASE=test
Run Code Online (Sandbox Code Playgroud)

更多解释:https: //stackoverflow.com/a/42917632/1069610


小智 15

编辑: tutumcloud存储库已弃用,不再维护,请参阅其他答案

我建议您使用环境变量来设置mongo用户,数据库和密码.tutum(由Docker拥有)发布了非常好的形象

https://github.com/tutumcloud/mongodb

docker run -d -p 27017:27017 -p 28017:28017 -e MONGODB_USER="user" -e MONGODB_DATABASE="mydatabase" -e MONGODB_PASS="mypass" tutum/mongodb
Run Code Online (Sandbox Code Playgroud)

您可以将这些变量转换为docker-compose环境变量.您不必对其进行硬编码.

environment:
    MONGODB_USER: "${db_user_env}"
    MONGODB_DATABASE: "${dbname_env}"
    MONGODB_PASS: "${db_pass}"
Run Code Online (Sandbox Code Playgroud)

此配置将从会话的环境变量中读取.

  • 这是对的,但这个docker镜像已被弃用,官方图片不支持此环境变量:/ (8认同)
  • 使用非官方 docker 映像向官方 docker 映像添加功能可能会给您带来问题 - 无法保证非官方库可以安全使用,或者是否正在积极维护。恕我直言,@GreenThumb 提出了一个更好的答案。 (3认同)

Gre*_*umb 14

我就是这样做的,我的要求是带上一些容器和mongodb,其他容器希望用户在他们出现时在场,这对我有用.好的部分是,mongoClientTemp在执行命令后退出,因此容器不会粘在一起.

version: '2'
services:
  mongo:
   image: mongo:latest
   container_name: mongo
   ports:
    - "27017:27017"
   volumes:
    - /app/hdp/mongo/data:/data/db

  mongoClientTemp:
   image: mongo:latest
   container_name: mongoClientTemp
   links:
    - mongo:mongo
   command: mongo --host mongo --eval  "db.getSiblingDB('dashboard').createUser({user:'db', pwd:'dbpass', roles:[{role:'readWrite',db:'dashboard'}]});"
   depends_on:
    - mongo

  another-container:
   image: another-image:v01
   container_name: another-container
   ports:
    - "8080:8080"
   volumes:
    - ./logs:/app/logs
   environment:
    - MONGODB_HOST=mongo
    - MONGODB_PORT=27017
   links:
    - mongo:mongo
   depends_on:
    - mongoClientTemp
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试此操作时,mongoClientTemp 容器会尝试在“mongo”容器准备就绪之前运行该命令,并且连接失败。建议使用“mongo-init.js”脚本的另一个答案效果很好 (2认同)

Pra*_*nav 11

在您的项目目录中创建另一个目录docker-entrypoint-initdb.d,\n文件树如下所示:

\n
Project-directory\n \xe2\x94\xa3 docker-entrypoint-initdb.d\n \xe2\x94\x83 \xe2\x94\x97 mongo-init.js\n \xe2\x94\x97 docker-compose.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

docker-compose.yml 包含:

\n
version: "3.7"\nservices:\n  mongo:\n    container_name: container-mongodb\n    image: mongo:latest\n    restart: always\n    ports:\n      - 27017:27017\n\n    environment:\n      MONGO_INITDB_ROOT_USERNAME: root\n      MONGO_INITDB_ROOT_PASSWORD: password\n      MONGO_INITDB_DATABASE: root-db\n\n    volumes:\n      - ./docker-entrypoint-initdb.d/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro\n
Run Code Online (Sandbox Code Playgroud)\n

mongo-init.js包含创建具有不同角色的用户的 javascript 代码。

\n
print("Started Adding the Users.");\ndb = db.getSiblingDB("admin");\ndb.createUser({\n  user: "userx",\n  pwd: "1234",\n  roles: [{ role: "readWrite", db: "admin" }],\n});\nprint("End Adding the User Roles.");\n
Run Code Online (Sandbox Code Playgroud)\n

mongo-init.js您可以根据需要修改。

\n


小智 5

阅读官方mongo docker 页面后,我发现即使使用了 auth 选项,您也可以一次性创建一个管理员用户。这没有很好的记录,但它确实有效(希望这不是一个功能)。因此,您可以一直使用 auth 选项。

我创建了一个github存储库,其中包含包含要使用的命令的脚本。要运行的最重要的命令行是:

docker exec db_mongodb mongo admin /setup/create-admin.js
docker exec db_mongodb mongo admin /setup/create-user.js -u admin -p admin --authenticationDatabase admin
Run Code Online (Sandbox Code Playgroud)

第一行将创建管理员用户(即使使用 auth 选项,mongo 也不会抱怨)。第二行将使用第一行的管理员权限创建“普通”用户。