ローカル環境で開発中に今のデータベースの状態保存しておきたい!
ってことたまにありますよね。
そんな時、汎用的に使えるコンテナ用意してみました
MySQL の Docker コンテナの中でそれやればよくね?
っていうツッコミはご勘弁ください m(_ _)m 笑
デモ用のプロジェクト
ディレクトリ構成
operate_mysql_from_external
- docker-compose.yml
- .env
- mysqldump
- Dockerfile
- mysqldump.sh
- dumpfiles
-
docker-compose.yml
自動で .env ファイルを読み込んでくれるのは楽チンですよね。
ちなみにここで環境変数の受け渡しをしているのは、環境変数を設定せずに実行した時に下記のようなエラーを出してくれるからです。 docker-compose 最高ですね
You need to set the {環境変数名} environment variable.
version: '3'
services:
mysqldump:
build: mysqldump
container_name: "demo-mysqldump"
volumes:
- './mysqldump/mysqldump.sh:/mysqldump.sh'
- './mysqldump/dumpfiles:/dumpfiles'
environment:
MYSQL_HOST: "${MYSQL_HOST}"
MYSQL_PORT: "${MYSQL_PORT}"
MYSQL_USER: "${MYSQL_USER}"
MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
MYSQLDUMP_OPTIONS: "${MYSQLDUMP_OPTIONS}"
MYSQLDUMP_DATABASE_OPTION: "${MYSQLDUMP_DATABASE_OPTION}"
command: sh mysqldump.sh
networks:
dafault:
external:
name: "${MYSQL_NETWORK}"
「MySQL Docker コンテナが使用しているネットワーク名」については
docker network ls
を使って確認してみてください。
特別なことをしていなければ
{プロジェクト名}_default
もしくは
{プロジェクト名}_{ docker-compose.yml で指定しているネットワーク名}
となっているはずです!
.env
コンテナ内で使用する環境変数を記述しておきます。
以下はサンプルなので必要に応じて変更してください
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_USER=user
MYSQL_PASSWORD=password
# MySQL Docker コンテナが使用しているネットワーク名
MYSQL_NETWORK=demo_mysql
MYSQLDUMP_OPTIONS=--quick --single-transaction
MYSQLDUMP_DATABASE_OPTION=demo
mysqldump
mysqldump する Docker コンテナ関連をまとめたディレクトリです。
Dockerfile
軽量の alpine に mysql-client を入れて使います。
FROM alpine:3.11
RUN apk update \
&& apk add mysql-client \
&& rm -rf /var/cache/apk/*
mysqldump.sh
mysqldump の処理を行うスクリプトです。
#!/bin/sh
# コマンドが失敗したら終了
set -e
echo "Domping for ${MYSQLDUMP_DATABASE_OPTION} from ${MYSQL_HOST}..."
readonly local OUTPUT_FILE="/dumpfiles/$(date +"%Y-%m-%dT%H%M%SZ").dump.sql"
readonly local MYSQL_HOST_OPTS="-h ${MYSQL_HOST} -P ${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PASSWORD}"
mysqldump ${MYSQL_HOST_OPTS} ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASE_OPTION} > "${OUTPUT_FILE}"
echo "Successfully dumped"
dumpfiles
dump したファイルたちがここに出力されます。
使い方
- MySQL の Docker コンテナが起動しているか確認
- .env に環境変数を設定する
- プロジェクトディレクトリで下記のコマンドを実行
# --rm を付けると実行後に自動でコンテナを削除してくれるよ
docker-compose run --rm mysqldump
おわりに
いかがでしょうか。
無事に mysqldump できましたか?
もし、こうした方がいいよ〜なんてことがあればコメントお待ちしています ( ^ ^ )/