ローカルを汚さずDockerでDBを復元する

DBの復元によって容量が圧迫される

問題の調査や分析をする際にバックアップされたファイルを復元することがあるのですが、今までは、

  • S3から対象のバックアップファイルをダウンロードしてくる
  • ローカルのMySQLに復元する

ということを行なっていました。問題調査や分析後に復元したDBを削除し忘れるとどんどん容量が圧迫されてしまいます。さらにはダウンロードしたバックアップファイルの削除も忘れるとさらに圧迫されてしまいます。

Dockerを使って復元してみる

方針

  1. バックアップファイルはpython(boto3)を使ってダウンロード
  2. MySQLの公式イメージを用いて指定の位置にバックアップファイルを配置

マルチステージビルトが便利

マルチステージビルドとはDockerfileにFROMを複数記述できるようなもので、FROMごとに新しいビルドが開始されるようなものです。(詳しくは公式ページ

今回作成したDockerfileは以下の通り

FROM python:3.7 AS get-stage

WORKDIR /app

COPY ./requirements.txt /app
RUN pip install --no-cache-dir -r requirements.txt

COPY ./get_dumps.py /app
RUN python get_dumps.py

FROM mysql:5.7

WORKDIR /app

ENV MYSQL_ROOT_PASSWORD=<your password> \
    MYSQL_DATABASE=<database name>

COPY --from=get-stage /app/backup.sql.gz /docker-entrypoint-initdb.d

get_dumps.pyではboto3を用いてs3から指定のバックアップファイル(backup.sql.gz)をダウンロードしています。

Point
  • ASでターゲット名を指定し、後に起動するイメージへ出力したファイルをコピー
  • 初期データ投入のために/docker-entrypoint-initdb.dにバックアップファイルを配置

起動して接続

起動する

$ docker image build -t restore-mysql
$ docker run --name restore-mysql-container -p 13306:3306 -d restore-db

接続してみる

$ mysql -u root -h 127.0.0.1 -P 13306 -p <database name>

終わりに

Dockerを使うことで、ローカルを汚さずDBを復元することができました。現状、バックアップファイルの指定はget_dumps.pyを手動で書き換えることでしかできません。今後はバックアップファイルの指定も簡単にできるようにしたいと思っています。

コメント

タイトルとURLをコピーしました