MongoDBコンテナの起動時に初期データを登録してみる

MongoDBをちょっと検証で利用するのに便利な方法をご紹介します。
通常DBコンテナには永続ボリュームをアタッチしますが、DBへの接続方法をクイックに確認したい時は、その処理が煩わしく感じます。そんな時私は、コンテナ起動時に簡単なデータを登録して検証しています。
今回はMongoDBを使って、初期データを投入する方法を紹介します。

  • jsonファイルを作成する
  • jsonファイルを登録するスクリプトを作成する
  • コンテナイメージを作成する
  • コンテナを実行する

jsonファイルを作成する


登録するデータを配列構造で記述したjsonファイル(categories.json)を作成します。

[
  { "name": "スポーツ" },
  { "name": "文化" },
  { "name": "娯楽" },
  { "name": "食事" },
  { "name": "お酒" },
  { "name": "イベント" },
  { "name": "ドライブ" },
  { "name": "文化" }
]

jsonファイルを登録するスクリプトを作成する


コンテナ起動時に、categories.jsonのデータをMongoDBに登録するスクリプト(init.sh)を作成します。
recommendDBの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" : "イベント" }
> 

以上です!