Dockerで開発環境のMySQLと同じデータを手軽にローカル環境でも利用する

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コンテナを利用している人は試してみると良いかと思います。