web-dev-qa-db-ja.com

docker-composeでmongodbにユーザーを作成する方法

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を実行してユーザーを追加できません。MongoDBユーザーがいない場合、および--authパラメーターが指定されていない場合、ログインせずにユーザーを作成できます。

自動的にそれをしたいのですが、いくつかのコマンドを手動でしたくありません。目標は、各統合テストの前に実行できるスクリプトを用意して、クリーンなデータベースから開始することです。

私のプロジェクトは次のとおりです。

integration-test/src/test/resources/scripts/docker-compose.yml

_mongodb:
    container_name: mongo
    image: mongo
  ports:
    - "27017:27017"
  volumes:
    - .:/setup
  command: --auth
_

integration-test/src/test/resources/scripts/docker-init.sh

_docker-compose down
docker-compose up -d
sleep 1
docker exec mongo bash -c "mongo myDatabase /setup/mongodb-setup.js"
_

integration-test/src/test/resources/scripts/mongodb-setup.js

_db.createUser(
{
    user: "myUser",
    pwd: "myPassword",
    roles: [
      { role: "readWrite", db: "myDatabase" }
    ]
})
_

新しいパラメーター(この場合は_--auth_)でコンテナーを再起動する方法を見つけることは役立ちますが、その方法はわかりません(docker startはパラメーターを取得しません)。

私が望むことをどのように行うべきか考えていますか?

そうでない場合でも、いくつかのJavaコードまたは他の何かでデータベースからすべてを削除できますが、スクリプトで作成された完全なmongodb Dockerセットアップが欲しいです。

29
jOHNdOE

EDIT: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

これらの変数をdocker-compose環境変数に変換できます。ハードコーディングする必要はありません。

environment:
    MONGODB_USER: "${db_user_env}"
    MONGODB_DATABASE: "${dbname_env}"
    MONGODB_PASS: "${db_pass}"

この構成は、セッションの環境変数から読み取ります。

15
timchunght

公式のmongoイメージは、次のようにdocker-composeで使用できる次の環境変数をサポートするようになりました。

environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=password
      - MONGO_INITDB_DATABASE=test

詳細な説明: https://stackoverflow.com/a/42917632/106961

25
jzqa

これは私がそれをする方法です、私の要件は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
14
GreenThumb

ファイル:docker-compose.yaml

mongo:
    image: mongo:latest
    volumes_from:
        - data
    ports:
        - "27017:27017"
    command: --auth

    container_name: "db_mongodb"

data:
    image: mongo:latest
    volumes:
        - /var/lib/mongo
        - ./setup:/setup
    command: "true"
    container_name: "db_mongodb_data"

ファイル:.buildMongo.sh

#!/bin/sh
docker-compose down
docker-compose up -d
sleep 1
docker exec db_mongodb  mongo admin /setup/create-admin.js
docker exec db_mongodb  mongo myDb /setup/create-user.js -u admin -p admin --authenticationDatabase admin

Create-admin.jsおよびcreate-user.jsファイルは、mongo Shellを使用して使用するコマンドです。したがって、あなたが理解しやすいものでなければなりません。実際の方向は、jzqaの答え「環境変数」のようなものです。ここでの質問は、ユーザーを作成する方法です。これは少なくともそのポイントに答えていると思う、ここで完全なセットアップを確認できます https://github.com/Lus1t4nUm/mongo_docker_bootstrap

1
user10047579

公式の mongo docker page を読んだ後、authオプションを使用している場合でも、管理ユーザーを1回作成できることがわかりました。これは十分に文書化されていませんが、単に機能します(機能ではないことを願っています)。したがって、常に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

最初の行はadminユーザーを作成します(mongoはauthオプションを使用しても文句を言いません)。 2行目は、最初の管理者権限を使用して「通常の」ユーザーを作成します。

Mongoイメージは、カスタム.jsまたは.shセットアップスクリプトをデプロイするための/docker-entrypoint-initdb.d/パスを提供します。

詳細については、この投稿を確認してください。 起動時にMongoDBコンテナ用のDBを作成する方法

0
Adam Kozyra