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で、複数環境で動かすことができそうだ。