🐋

Docker + Embulk でDBからCSVを抽出するだけの最小構成ガイド

に公開

はじめに

システムリプレイスに伴うデータ移行対応で、Embulk を使って DB からデータを抽出する必要があり、Docker 上に実行環境を構築しました。本記事では、その構築手順と設定内容を備忘としてまとめています。

対象範囲は、Docker + Embulk 環境で「DB から CSV を抽出すること」までで移行処理は含みません。

なお、今回構築したサンプル環境は以下の GitHub リポジトリに公開していますので、ご自由にご利用ください。

https://github.com/masuoka-hcompany/docker-embulk-example

動作環境

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

動作確認

設定ファイルの準備が完了したら、以下の手順で動作確認を行います。

  1. Docker 環境を起動する。
docker compose up -d
  1. Docker コンテナに内に入る。
docker compose exec docker-embulk-example bash
  1. Embulk 実行コマンドを叩く。
embulk run --enable-liquid /work/config/test.yml.liquid

output ディレクトリに csv ファイルが出力されていれば、OK です。

H&Companyテックブログ

Discussion