先日の記事では、Ganacheを利用して、イーサリアムのローカルネット構築を行いました。
それは、大変優れた、素晴らしいものだったんですが、残された最後の一つの欲求がありまして…。
そう。私、ローカルネットワークをDockerコンテナ内に閉じ込めたいんです…!
別プロジェクトの内容が、同じ開発環境に積まれるのが嫌なんです…!
という訳で、今回は、Dockerコンテナ内で完結するローカルネットの構築をおこないたいと思います。
ついでにと言うかなんて言うかですが、通常起動だとganacheはデータを永続化しない(次回起動時には、デプロイしたデータが飛んでる)ので、永続化もしてしまいましょう。
ganache-cliを使ってみる
Truffleチームが公開しているリポジトリの中に ganache-cliというものがあります。
これ、わりと最初から存在には気づいていたんですが、「cli」という名前が付いていたので、
ローカルネットを立ち上げて待ち構える「server」系のプロダクトではないように感じてしまったんですね。
なので、あまりよく見ないで敬遠していたんですが、よく見てみると、ethereumjs-testrpcが名前を変えたものだったんですね。
こいつが使えそうです。
docker系の諸々を整える
まずは、ganache-cliのDockerfileから。
これ、もしかしたら ENV DOCKER true
さえあれば、 --host=0.0.0.0
の指定は不要かもです。
また、上記にコメントで記載していますが、データを永続化したい場合、mnemonicとnetworkIdの指定が必須になります。
ganache-cliの方は /var/ganache
にデータを永続化するようにして立ち上げているので、ボリュームを割り当て、再度dockerを立ち上げてもブロックチェーンを引き継げるようにします。
docker-composeで立ち上げる
docker-composeでコンテナを立ち上げてみると、非常にそれらしい出力を確認できました…!
truffleから接続してみる
他コンテナで起動しているtruffleから接続できるか確認してみます。
truffle.jsの修正
ネットワークの設定をいじる必要性があります。
truffleも、ganacheも、共にdockerコンテナで立ち上がるので、ホストの参照を変えなくてはなりません。
consoleで接続可能か確認
おお。できてるっぽい。
もし、接続できない場合は、この時点でエラーになるので、ここまで表示されれば接続は完璧です。
デプロイしてみる
では、デプロイしてみましょう…!ドキドキ。
できたっぽい?
念のため、一度docker-composeを落とし、再度立ち上げて、再実行してみます。
ganacheを再起動してもデータが残ってるっぽいですね!完璧です。