LoginSignup
0
1

More than 5 years have passed since last update.

Docker MongoDB の コンテナ を migration ( DBやCollection を image作成時に作成する ) を行う

Posted at

背景

ローカル環境のMongoDB を もっと気軽に使い捨てしたなという思いから docker コンテナにすることにしました。
MongoDBをコンテナにするにあたり、DockerHubにある、MongoDBの公式イメージを使用し、コンテナ作成時にmigrationも行えないかと色々やっていたのですが、うまくいかなかったので、imageから自作することにしました。これはそんな公式imageを使えなかった情弱の記録です。

imageの作成

base imageは、 debian:wheezy-slim を使用します

MongoDB Install

MongoDBのversionは、3.6 を使用します。

debian-wheezy への mongo の install は、 Mongo公式サイトの方法 で入れます。

# 鍵の追加
RUN  apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

# apt update && MongoDB install
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
          mongodb-org=${MONGO_INSTALL_VAERSION}\
          mongodb-org-server=${MONGO_INSTALL_VAERSION}\
          mongodb-org-shell=${MONGO_INSTALL_VAERSION}\
          mongodb-org-mongos=${MONGO_INSTALL_VAERSION}\
          mongodb-org-tools=${MONGO_INSTALL_VAERSION}

CMD ["mongod"]

このまま だと mongoプロセスが 死んでしまう。
どうも、 /var/ 以下に、 データやログを書き込めてない?
公式Dockerfileを参考に試行錯誤した結果、以下のように configとDockerfileを変更

mongod.conf
systemLog:
  path: "/data/log/mongodb/mongod.log"
storage:
  dbPath: "/data/db"
Dockerfile

RUN rm -rf /var/lib/mongodb \
    && mkdir -p /data/db /data/log/mongodb \
    && chown -R mongodb:mongodb /data/db /data/log/mongodb

これで、とりあえず、mongoコンテナが稼働したので、ここから、migrationを行えるようにしていきます。

MongoDB Migration

MongoDBユーザは、.js で外部ファイルから流し込み、
Migrationを行うDataは、あらかじめ使用していたMongoDBからdumpを取り出し、そのBSONを monogrestore で復元する方法をとります。
MongoDB dump 方法

image作成段階だと、mongoプロセスが起動していないので、mongod で、mongoサーバを起動させます。
この時、 mongod.conf の設定で、

mongod.conf
processManagement:
  fork: flase

だと、 
waiting for connections port 2017 と、入力があるまで、処理が止まってしまうので、

mongod.conf
processManagement:
-  fork: flase
+  fork: true 

にしておく。

その後に、
monogo --quiet で 良いしている jsファイルで、ユーザを作成し、
mongoretore で BSONを流し込みます。

jsファイルと、BSONは、 COPY し、使用後に、削除しています。

Dockerfile
COPY initialize /usr/src/init/

ENV MONGO_HOST localhost
ENV MONGO_PORT 27017

RUN mongod --config /etc/mongod.conf \
    && mongo --quiet ${MONGO_HOST}:${MONGO_PORT}/admin /usr/src/init/create_user/admin.js \
    && mongo --quiet ${MONGO_HOST}:${MONGO_PORT}/demo /usr/src/init/create_user/demo.js \
    && mongorestore --db demo --host ${MONGO_HOST} --port ${MONGO_PORT} /usr/src/init/dump/demo \
    && rm -rf /usr/src/init/

MongoDBコンテナをMigrationしようとしたときにのハマりポイント

  1. Mongo default の config だと、mongoプロセスが死ぬ。
    -> Dataやlogの保存場所を /var/ から変更
    -> ここは、dockerの仕様なのか調べてみます。どなたか知っている人いれば教えて欲しい。
  2. waiting for connections port 2017 で先に進まない
    -> processManagement.fork=true にする
  3. 公式imageを使いこなせない ( º﹃º ) -> 時間見つけて頑張ろう・・・
  4. 他にもたくさんハマったんですが、終わってしまうと、何にハマったか覚えてない・・・
    喉元過ぎれば熱さを忘れる です。 すみません。。。m(_ _)m

最後に

公式imageは便利ですが、Dockerfileを自分で作成していくと色々と勉強になることも多いです。
imageができたら、それを軽量化するために、あれやこれやをすると、Dockerの仕組みを自然と調べることになるので、効率重視で、公式imageを使用するのもいいですが、暇な時は、自分でimageを作成するのもいいかもしれないですね。

決して、公式imageを使いこなせなかった言い訳じゃないです( ; ; )

コードは、GitHubにあげていますので、詳細が見たいかたは、そちらをご参照ください。
GitHub Repository

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1