LoginSignup
7
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-09

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

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

MySQL の Docker コンテナの中でそれやればよくね?
っていうツッコミはご勘弁ください m(_ _)m 笑

デモ用のプロジェクト

こちら

ディレクトリ構成

operate_mysql_from_external
 - docker-compose.yml
 - .env
 - mysqldump
    - Dockerfile
    - mysqldump.sh
    - dumpfiles
       - 

docker-compose.yml

自動で .env ファイルを読み込んでくれるのは楽チンですよね。

ちなみにここで環境変数の受け渡しをしているのは、環境変数を設定せずに実行した時に下記のようなエラーを出してくれるからです。 docker-compose 最高ですね :relaxed:
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

コンテナ内で使用する環境変数を記述しておきます。
以下はサンプルなので必要に応じて変更してください :robot:

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 公式リファレンス

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4