MongoDB(Docker) 初期データの設定方法
やりたいこと
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