別の Docker コンテナから mysqldump !!


ローカル環境で開発中に今のデータベースの状態保存しておきたい!
ってことたまにありますよね。

そんな時、汎用的に使えるコンテナ用意してみました

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}"

参考
ネットワークの external 設定について
既存のネットワークを使う

「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 したファイルたちがここに出力されます。

使い方

  1. MySQL の Docker コンテナが起動しているか確認
  2. .env に環境変数を設定する
  3. プロジェクトディレクトリで下記のコマンドを実行
# --rm を付けると実行後に自動でコンテナを削除してくれるよ
docker-compose run --rm mysqldump

おわりに

いかがでしょうか。
無事に mysqldump できましたか?
もし、こうした方がいいよ〜なんてことがあればコメントお待ちしています ( ^ ^ )/

参考

docker compose run について
mysqldump 公式リファレンス