👨‍🚀

MongoDB(Docker) 初期データの設定方法

2021/02/17に公開

やりたいこと

MongoDBのDockerイメージからコンテナを作るときに初期データをセットしたい。

docker hub - mongo 内の説明にある初期データの設定方法について試した内容の備忘。

Initializing a fresh instance
When a container is started for the first time it will execute files with extensions .sh and .js that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. .js files will be executed by mongo using the database specified by the MONGO_INITDB_DATABASE variable, if it is present, or test otherwise. You may also switch databases within the .js script.

環境

  • PC: MacBook Air (M1, 2020)
  • OS: MacOS Big Sur 11.1
  • CPU: Apple M1
  • Docker: version 20.10.1, build 831ebeae96

ケース1 単一DBの場合

MONGO_INITDB_DATABASE で対象のDBを指定して、クエリファイルを/docker-entrypoint-initdb.d に配置する。

Dockerfile

FROM mongo:4

ENV MONGO_INITDB_ROOT_USERNAME root
ENV MONGO_INITDB_ROOT_PASSWORD password
ENV MONGO_INITDB_DATABASE app1

ENV TZ="Asia/Tokyo"
RUN echo $TZ > /etc/timezone

COPY init.js /docker-entrypoint-initdb.d/

init.js

db.createUser({user: "foo", pwd: "foo-password", roles: [{role:"readWrite",db: "app1"}]})

ケース2 複数DBの場合

MONGO_INITDB_DATABASEだとDB指定になるため、クエリファイル側で流し込むDBを切り替える例

Dockerfile

FROM mongo:4

ENV MONGO_INITDB_ROOT_USERNAME root
ENV MONGO_INITDB_ROOT_PASSWORD password

ENV TZ="Asia/Tokyo"
RUN echo $TZ > /etc/timezone

COPY init.js /docker-entrypoint-initdb.d/

init.js

db = db.getSiblingDB("app1");
db.createUser({user: "foo", pwd: "foo-password", roles: [{role:"readWrite",db: "app1"}]})

db = db.getSiblingDB("app2");
db.createUser({user: "bar", pwd: "bar-password", roles: [{role:"readWrite",db: "app2"}]})

もしくは mongo シェルを使ったパターン

Dockerfile

FROM mongo:4

ENV MONGO_INITDB_ROOT_USERNAME root
ENV MONGO_INITDB_ROOT_PASSWORD password

ENV TZ="Asia/Tokyo"
RUN echo $TZ > /etc/timezone

COPY init.sh /docker-entrypoint-initdb.d/

init.sh

#!/bin/sh

query=$(cat <<EOS
use app1\n
db.createUser({user: "foo", pwd: "foo-password", roles: [{role:"readWrite",db: "app1"}]})\n

use app2\n
db.createUser({user: "bar", pwd: "bar-password", roles: [{role:"readWrite",db: "app2"}]})\n
EOS
)

echo -e "\n" $query | mongo -u $MONGO_INITDB_ROOT_USERNAME -p$MONGO_INITDB_ROOT_PASSWORD

参考: ファイル構成, docker-compose.yml

tree
.
|-- docker-compose.yml
|-- mongo
|   |-- Dockerfile
|   `-- init.js
`-- mongo_express
    `-- Dockerfile

docker-compose.yml

version: '3'

services:
  mongo:
    build: ./mongo
    restart: always
    ports:
      - 27017:27017

  mongo-express:
    build: ./mongo_express
    restart: always
    ports:
      - 8081:8081

mongo_express/Dockerfile

FROM  mongo-express

ENV ME_CONFIG_MONGODB_ADMINUSERNAME root
ENV ME_CONFIG_MONGODB_ADMINPASSWORD password

ENV TZ="Asia/Tokyo"
RUN echo $TZ > /etc/timezone

Discussion