Microservicesを運用していると、サービス毎にDBを持つことになってどうしても扱うDBやスキーマが多くなってしまいます。 開発環境のMySQL(AWSならRDS)に直接接続するならまだしも、DBはローカルにもって好き勝手に使ったり、汚したりスクラップしたりしたいですよね。
というわけで、Dockerを使ってカジュアルにその環境を作ってみました。
やりたいこと
やりたいことを以下の図のような感じ。
- docker runでMySQLのコンテナを起動する
- コンテナ起動時に任意のRDSからダンプを取得し、コンテナ内のMySQLにリストアする(もちろんRDSでもAWSでもなくて良い)
- 使う
- 再度docker runすると、また最新のダンプからリストアするので開発環境DBと同じデータのDBをローカルに簡単に構築できる
たいしたものではないですが、GitHubとDockerHubに晒しました。
使い方はdocker-compose-example.ymlを見てもらえれば一目瞭然です。
mysql:
image: stormcat24/mysql-remote:latest
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: ""
MYSQL_DATABASE: test # anything ok
MYSQL_USER: youruser
MYSQL_PASSWORD: yourpassword
MYSQL_ALLOW_EMPTY_PASSWORD: yes
IMPORT_SOURCES: "your_db_host1,3306,username,password,database1|your_db_host2,3306,username,password,database2"
ユーザー名やパスワードはそれぞれ適切に設定してもらって、あとはIMPORT_SOURCESを環境変数で設定するだけです。 パイプ区切りで複数データソースを設定でき、カンマ区切りで(ホスト、ポート、ユーザー、パスワード、データベース)を指定します。
環境変数でやると直列になってしまって視認性が悪いのがやや残念なところでしょうか。別途JSONを読ませても良いかもしれません。
MySQLのベースイメージ
DockerHubにある公式イメージをベースに作っています。このDockerfileは色々と上手く作られていて、/docker-entrypoint-initdb.d
にSQLやシェルスクリプトを配置すると、docker run時にそれを実行することができます。色々と応用が効くのでローカルでMySQLコンテナを利用している人は試してみると良いかと思います。