MongoDBをちょっと検証で利用するのに便利な方法をご紹介します。
通常DBコンテナには永続ボリュームをアタッチしますが、DBへの接続方法をクイックに確認したい時は、その処理が煩わしく感じます。そんな時私は、コンテナ起動時に簡単なデータを登録して検証しています。
今回はMongoDBを使って、初期データを投入する方法を紹介します。
- jsonファイルを作成する
- jsonファイルを登録するスクリプトを作成する
- コンテナイメージを作成する
- コンテナを実行する
jsonファイルを作成する
登録するデータを配列構造で記述したjsonファイル(categories.json)を作成します。
[ { "name": "スポーツ" }, { "name": "文化" }, { "name": "娯楽" }, { "name": "食事" }, { "name": "お酒" }, { "name": "イベント" }, { "name": "ドライブ" }, { "name": "文化" } ]
jsonファイルを登録するスクリプトを作成する
コンテナ起動時に、categories.jsonのデータをMongoDBに登録するスクリプト(init.sh)を作成します。recommend
DBのcategories
コレクションに、/docker-entrypoint-initdb.d/categories.json
の配列構造データを登録しています。
mongoimport --authenticationDatabase admin --username root --password password --db recommend --collection categories --drop --file /docker-entrypoint-initdb.d/categories.json --jsonArray
mongoimportコマンドのドキュメントは以下URLになります。
https://docs.mongodb.com/manual/reference/program/mongoimport/--drop
は、データ登録時にそのコレクションがあった場合、一度削除してからデータを登録します。--jsonArray
は、配列構造を扱うためのオプションです。
コンテナイメージを作成する
MongoDBを起動するためのDockerfileを作成します。
ビルド用ディレクトリ構造は以下の通りです。
$ tree . . ├── Dockerfile ├── categories.json └── init.sh
Dockerfileは以下の通りです。
mongoベースイメージを取得して、/docker-entrypoint-initdb.d
に上記で作成したcategories.jsonとinit.shをコピーしています。/docker-entrypoint-initdb.d
にスクリプトを配置することで、コンテナ起動時に実行されます。
FROM mongo:latest COPY categories.json /docker-entrypoint-initdb.d/ COPY init.sh /docker-entrypoint-initdb.d/
以下のコマンドでコンテナイメージを作成します。
$ docker build -t mongo-test . Sending build context to Docker daemon 4.096kB Step 1/3 : FROM mongo:latest ---> 3f3daf863757 Step 2/3 : COPY categories.json /docker-entrypoint-initdb.d/ ---> Using cache ---> 209a1bede01c Step 3/3 : COPY init.sh /docker-entrypoint-initdb.d/ ---> Using cache ---> 68ffc7b95b98 Successfully built 68ffc7b95b98 Successfully tagged mongo-test:latest
コンテナを実行する
コンテナを実行します。今回はdocker-compose.yamlを作成しました。
version: '3' services: db: container_name: db image: mongo-test:latest environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: password ports: - "27017:27017"
以下のコマンドで実行します。
$ docker-compose up -d Creating network "wishy_default" with the default driver Creating db ... done
以下のコマンドで確認してみましょう。データが登録されていることがわかります。
$ docker exec -it db /bin/bash root@897eb9caf5c4:/# mongo -uroot -ppassword > show dbs admin 0.000GB config 0.000GB local 0.000GB recommend 0.000GB > use recommend switched to db recommend > db.categories.find() { "_id" : ObjectId("5ecbe8257399a6df837e7384"), "name" : "スポーツ" } { "_id" : ObjectId("5ecbe8257399a6df837e7385"), "name" : "娯楽" } { "_id" : ObjectId("5ecbe8257399a6df837e7386"), "name" : "食事" } { "_id" : ObjectId("5ecbe8257399a6df837e7387"), "name" : "お酒" } { "_id" : ObjectId("5ecbe8257399a6df837e7388"), "name" : "文化" } { "_id" : ObjectId("5ecbe8257399a6df837e7389"), "name" : "ドライブ" } { "_id" : ObjectId("5ecbe8257399a6df837e738a"), "name" : "文化" } { "_id" : ObjectId("5ecbe8257399a6df837e738b"), "name" : "イベント" } >
以上です!