Mongodbを使用してdockerを作成し、自動的にユーザーを作成するようなスクリプトを作成しようとしています。
通常、docker-composeを使用してdockerイメージを管理できますが、今回はその方法がわかりません。
基本的に、ここで私がしなければならないことです:
docker-compose down
_)--auth parameter
_なし)db.createUser()
を含むスクリプトを実行--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セットアップが欲しいです。
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}"
この構成は、セッションの環境変数から読み取ります。
公式のmongoイメージは、次のようにdocker-composeで使用できる次の環境変数をサポートするようになりました。
environment:
- MONGO_INITDB_ROOT_USERNAME=user
- MONGO_INITDB_ROOT_PASSWORD=password
- MONGO_INITDB_DATABASE=test
これは私がそれをする方法です、私の要件は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
ファイル: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
公式の 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を作成する方法