TORIPIYO DIARY

recent events, IoT, programming, security topics

Dockerを利用してローカル環境のmongoDBをhomebrewの3.2からdockerコンテナの3.6に移行させる

現在開発中のアプリケーションで利用しているmongooseをバージョンアップさせたら正しくアプリケーションが動作しなくなり、直すには、mongoDBのバージョンを3.6に上げることが必要なことがわかりました。
ローカル環境のmongoDBは、brew install mongoでインストールしたmongoDB 3.2系を利用していたので、brew upgrade mongodbを実行して3.6系にバージョンを変更。
これで、問題なく動くようになると思ったら、、、

mongod --config /usr/local/etc/mongod.conf

を実行すると以下のメッセージが表示されてmongoDBを起動出来ません。

2018-03-12T00:01:13.020+0900 F CONTROL  [initandlisten] ** IMPORTANT: UPGRADE PROBLEM: The data files need to be fully upgraded to version 3.4 before attempting an upgrade to 3.6; see http://dochub.mongodb.org/core/3.6-upgrade-fcv for more details.
2018-03-12T00:01:13.020+0900 I NETWORK  [initandlisten] shutdown: going to close listening sockets...

エラーメッセージを見た限りでは、/usr/local/var/mongodbに置いてあるデータは、異なるバージョン間では互換性が無いようでうまく読み込みが出来ない様子。そこで、mongoDB3.2からデータをダンプして、mongoDB3.6にダンプしたデータを読み込ませることにしました。

brew switch mongodb 3.2.1 

でバージョンを3.6から3.2に戻して、

mongodump -v --out data-`date +"%m-%d-%y"` 

を実行すると、なぜかコマンドから応答が帰ってこなくてdumpファイルを取得できない。もしかしたら、正しい場所に繋ぎに行こうと出来ていないのかもしれませんが、原因わからず。ここまで来て、dockerを使ってデータのダンプとリストアを実行することにしました。

mongoDB 3.2からdumpファイルの取得

まず、mongoDB3.2のコンテナを動かします。この時、ローカル環境のmongoDBデータを読み込ませられるように、-vオプションでローカルの/usr/local/var/mongodbを、コンテナの/data/dbパス上にマウントさせます。

docker run --name mongo-3.2 -v /usr/local/var/mongodb:/data/db -d mongo:3.2

稼働しているmongo-3.2コンテナに対して、mongodumpコマンドを実行してdumpファイルをmongo-3.2コンテナ上の/tmpディレクトリ配下に作成します。

docker exec mongo-3.2 mongodump -v --out /tmp/data-`date +"%m-%d-%y"`

コンテナ上のdumpファイルをローカル上にコピーします。

docker cp mongo-3.2:/tmp/data-`date +"%m-%d-%y"` .

これで、dockerを利用してmongoDBのdumpファイルを取得できました。

mongoDB 3.6でdumpファイルの読み込み

mongoDB3.6のコンテナを稼働させて、mongoDB 3.2から取得したdumpファイルを読み込ませるようにします。3.6ではdockerボリューム上にデータを置きたいので、まず、mongoDB用のdockerボリュームを作成します。

docker volume create db

mongoDB 3.6を稼働させます。-vオプションで、dbボリュームをコンテナの/data/dbパスにマウント。-pオプションで、ローカルマシンの27017ポートに繋ぐとコンテナの27017ポートに転送されるように設定します。

docker run --name mongo-3.6 -v db:/data/db -p 27017:27017 -d mongo:3.6

ローカル上のdumpファイルをmongoDB 3.6のコンテナ上にコピーします。

docker cp data-`date +"%m-%d-%y"` mongo-3.6:/tmp

稼働しているmongoDB 3.6のコンテナに対して、mongorestoreコマンドを実行させてdumpデータを読み込ませます。

docker exec mongo-3.6 mongorestore /tmp/data-`date +"%m-%d-%y"`


===========================================

これで、homebrewでインストールしたmongoDB 3.2を、dockerコンテナのmongoDB 3.6コンテナに切り替えることができるようになりました。これからは、ローカル環境のmongoDBはdockerで管理したいと思います。