🐋
Docker + Embulk でDBからCSVを抽出するだけの最小構成ガイド
はじめに
システムリプレイスに伴うデータ移行対応で、Embulk を使って DB からデータを抽出する必要があり、Docker 上に実行環境を構築しました。本記事では、その構築手順と設定内容を備忘としてまとめています。
対象範囲は、Docker + Embulk 環境で「DB から CSV を抽出すること」までで移行処理は含みません。
なお、今回構築したサンプル環境は以下の GitHub リポジトリに公開していますので、ご自由にご利用ください。
動作環境
- Windows 11
- WSL2 + Docker
- Docker Desktop 25.0.3
ディレクトリ構成
├── config # Embulk データ処理用設定ファイルの配置先
│ └── test.yml.liquid # 検証用のEmbulk データ処理用設定ファイル
├── output # csvファイルの出力先ディレクトリ
├── .env
├── docker-compose.yml
├── Dockerfile
└── embulk.properties
環境構築に必要な設定ファイル
環境構築に必要な設定ファイル群の記述内容について、以下に列挙していきます。
Docker Compose
docker-compose.yaml
version: "3.9"
services:
docker-embulk-example:
build:
context: .
dockerfile: Dockerfile
container_name: docker-embulk-example
volumes:
- ./output:/output
- ./config:/work/config
env_file:
- .env
tty: true
command: >
sh -c "
sshpass -p "SSH_PASSWORD" ssh -N -L 3307:DB_HOST:3306 \
-o StrictHostKeyChecking=no -o AddressFamily=inet \
-p SSH_PORT SSH_USER@SSH_HOST
"
Dockerfile
Embulk 構築に必要なコンテナ・パッケージ・プログラムファイルなどを定義します。
Dockerfile
FROM openjdk:8
# コンテナに必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
curl \
default-mysql-client \
openssh-client \
sshpass
# jrubyをインストール
RUN curl --create-dirs -o "./jruby-complete-9.3.14.0.jar" -L "https://repo1.maven.org/maven2/org/jruby/jruby-complete/9.3.14.0/jruby-complete-9.3.14.0.jar"
RUN chmod +x ./jruby-complete-9.3.14.0.jar
# Embulkをダウンロードして実行可能にする
RUN curl --create-dirs -o ~/.embulk/bin/embulk -L "https://github.com/embulk/embulk/releases/download/v0.11.5/embulk-0.11.5.jar"
RUN chmod +x ~/.embulk/bin/embulk
RUN echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
RUN . ~/.bashrc
COPY ./embulk.properties ./root/.embulk/embulk.properties
RUN java -jar ~/.embulk/bin/embulk gem install embulk -v 0.11.5
RUN java -jar ~/.embulk/bin/embulk gem install embulk-input-mysql
RUN java -jar ~/.embulk/bin/embulk gem install liquid
WORKDIR /work
embulk.properties
Embulk のグローバル設定ファイルに JRuby のパス指定の記述します。
embulk.properties
jruby=file:///jruby-complete-9.3.14.0.jar
.env
複数の Embulk の設定ファイルを利用する場合に、DB の接続情報は一元で管理したいので、.env ファイルに DB の接続情報を記載します。
.env
DB_DRIVER=mysql
DB_HOST=127.0.0.1
DB_PORT=3307
DB_NAME=test
DB_USERNAME=test
DB_PASSWORD=G5y4XtxeZdG3
Embulk 設定ファイル(例:test.yml.liquid)
Embulk 設定ファイルに関しては、通常の YAML ファイルでも利用可能ですが、今回は.env で設定した内容を動的に埋め込む為、Liquid テンプレートエンジンが利用可能な YAML ファイルを利用します。
test.yml.liquid
in:
type: {{ env.DB_DRIVER }}
host: {{ env.DB_HOST }}
user: {{ env.DB_USERNAME }}
password: {{ env.DB_PASSWORD }}
database: {{ env.DB_NAME }}
port: {{ env.DB_PORT }}
query: "select * from test limit 0,10;"
out:
type: file
path_prefix: "/output/test"
file_ext: ".csv"
formatter:
type: csv
delimiter: ","
newline: CRLF
newline_in_field: LF
charset: UTF-8
quote_policy: MINIMAL
quote: '"'
escape: "\\"
null_string: "\\N"
default_timezone: "Asia/Tokyo"
動作確認
設定ファイルの準備が完了したら、以下の手順で動作確認を行います。
- Docker 環境を起動する。
docker compose up -d
- Docker コンテナに内に入る。
docker compose exec docker-embulk-example bash
- Embulk 実行コマンドを叩く。
embulk run --enable-liquid /work/config/test.yml.liquid
output ディレクトリに csv ファイルが出力されていれば、OK です。
Discussion