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で管理したいと思います。