DockerでMongoDBコンテナ起動時に初期データをインポートする


はじめに

DockerでMongoDBをコンテナを立ち上げ、データを確認するまでの最小限の構成になります。

やりたいこと

  • コンテナ作成時に初期データを投入したい
  • 投入したデータをGUIクライアントで参照したい

ディレクトリ構成

.
├── docker-entrypoint-initdb.d
│   ├── 1-mongo-init.js
│   ├── 2-mongo-init.sh
│   └── staffs.json
└── docker-compose.yml

各ファイルの内容

docker-compose.yml

「MONGO_INITDB_DATABASE」に指定した名称でデータベースが作成されます。

docker-compose.yml
version: '3.3'

services:
  mongo:
    image: mongo
    container_name: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo
      MONGO_INITDB_ROOT_PASSWORD: mongo
      MONGO_INITDB_DATABASE: mongo_example
      TZ: Asia/Tokyo
    ports:
      - 27018:27017
    volumes:
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

docker-entrypoint-initdb.d/1-mongo-init.js

ユーザの作成と合わせて、コレクションの作成をしています。
ここでは例としてstaffsコレクションを作成します。

docker-entrypoint-initdb.d/1-mongo-init.js
var user = {
  user: "mongo",
  pwd: "mongo",
  roles: [
    {
      role: "dbOwner",
      db: "mongo_example"
    }
  ]
};

db.createUser(user);
db.createCollection('staffs');

docker-entrypoint-initdb.d/2-mongo-init.sh

作成したユーザ、パスワード、データベース、コレクションと、インポートするJSONファイルを指定します。

docker-entrypoint-initdb.d/2-mongo-init.sh
mongoimport -u mongo -p mongo --db mongo_example --collection staffs --file /docker-entrypoint-initdb.d/staffs.json --jsonArray

docker-entrypoint-initdb.d/staffs.json

staffsコレクションにインポートするデータをJSONファイルで用意します。

docker-entrypoint-initdb.d/staffs.json
[
    {
        "id" : 1,
        "name" : "佐藤"
    },
    {
        "id" : 2,
        "name" : "鈴木"
    },
    {
        "id" : 3,
        "name" : "田中"
    }
]

実行

docker-composeで起動します。

$ docker-compose up -d
Creating network "mongodb_default" with the default driver
Creating mongo ... done

GUIクライアントで確認する

1. MongoDB Compassをダウンロード

MongoDB CompassからPlatformを選択しDownloadボタンをクリックします。

2. 接続

Paste your connection stringに以下の接続情報を入力し、CONNECTボタンをクリックします。

mongodb://mongo:mongo@localhost:27018

3. 結果

staffコレクションにデータをインポートできていることが確認できます。