tl;dr;
embulk で環境変数を処理することができる.liquid
について紹介。これを使うことで、docker image を複数環境で起動することができるようになる。
公式ドキュメント
以下のような記載がある。
https://www.embulk.org/docs/built-in.html
試してみた
準備
以下のようなディレクトリ構成
“`
├── Dockerfile
└── config.yml.liquid
“`
それぞれ中身は以下の通り
FROM java:8
MAINTAINER sumito.tsukada "tsukada@sumito.jp"
ENV EMBULK_VERSION 0.9.23
RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery
COPY config.yml.liquid /work/
WORKDIR /work
ENTRYPOINT ["java", "-jar", "/opt/embulk.jar", "run", "/work/config.yml.liquid"]
受け取る側には {{env.}} を接頭辞として付ける。
in:
type: mysql
user: {{env.DB_USER}}
password: {{env.DB_PASS}}
database: {{env.DB_NAME}}
host: {{env.DB_HOST}}
query: {{env.DB_QUERY}}
out: {type: stdout}
build
docker build コマンドでビルドする。
$ docker build -t tsukada/embulk .
Sending build context to Docker daemon 3.072kB
Step 1/9 : FROM java:8
---> d23bdf5b1b1b
Step 2/9 : MAINTAINER sumito.tsukada "tsukada@sumito.jp"
---> Using cache
---> 5fc85815e7bd
Step 3/9 : ENV EMBULK_VERSION 0.9.23
---> Using cache
---> d449016ef749
Step 4/9 : RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
---> Using cache
---> ea1d918c1c64
Step 5/9 : RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
---> Using cache
---> e7057cd4cefe
Step 6/9 : RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery
---> Using cache
---> 01d70f5dc598
Step 7/9 : COPY config.yml.liquid /work/
---> Using cache
---> 8f7529947df8
Step 8/9 : WORKDIR /work
---> Using cache
---> 7d4b1d4ea599
Step 9/9 : ENTRYPOINT ["java", "-jar", "/opt/embulk.jar", "run", "/work/config.yml.liquid"]
---> Using cache
---> 8161e0f70fde
Successfully built 8161e0f70fde
Successfully tagged tsukada/embulk:latest
使い方
環境変数に接続先情報や、クエリの情報を渡す。
$ docker run -e DB_USER=tsukada -e DB_PASS=password -e DB_NAME=database -e DB_HOST=hogehoge.ap-northeast-1.rds.amazonaws.com -e DB_QUERY="select * from sample" --rm -it tsukada/embulk
2020-02-18 03:43:44.882 +0000: Embulk v0.9.23
(中略)
2020-02-18 03:43:52.822 +0000 [INFO] (0015:task-0000): > 0.00 seconds
1,tsukada,hoge,,2020-02-14 09:14:31,2020-02-14 09:14:32,84,004,2020-02-14 09:14:31,2020-02-14 09:14:31
2020-02-18 03:43:52.913 +0000 [INFO] (0001:transaction): {done: 1 / 1, running: 0}
2020-02-18 03:43:52.917 +0000 [INFO] (main): Committed.
2020-02-18 03:43:52.917 +0000 [INFO] (main): Next config diff: {"in":{},"out":{}}
.liquid ファイル内では env. で受け取るが、docker 起動する際に渡す環境変数には、env を付けづに実行する。
無事データを取得することができた。
所感
これを使えば、コンテナ内にcredential情報を保持しなくて済むようになるため、1つのcontainer imageで、複数環境で動かすことができそうだ。