概要
DigdagでDockerを利用するときには、Dockerホストの環境変数が引き継がれるようなので、注意が必要です。
再現方法
+test:
_export:
docker:
image: ubuntu:16.04
sh>: printenv
実行結果
digdag run docker_test.dig --rerun
2017-07-26 12:48:14 +0900: Digdag v0.9.12
2017-07-26 12:48:15 +0900 [WARN] (main): Reusing the last session time 2017-07-26T00:00:00+00:00.
2017-07-26 12:48:15 +0900 [INFO] (main): Using session /Users/shiozaki/Documents/digdag_test/project/.digdag/status/20170726T000000+0000.
2017-07-26 12:48:15 +0900 [INFO] (main): Starting a new session project id=1 workflow name=docker_test session_time=2017-07-26T00:00:00+00:00
2017-07-26 12:48:16 +0900 [INFO] (0018@[0:default]+docker_test+test): sh>: printenv
TERM_SESSION_ID=w0t2p0:B7E8E7A6-A108-48DD-9BD8-0DB64CD9347E
session_date=2017-07-26
timezone=UTC
session_unixtime=1501027200
USER=shiozaki
project_id=1
<略>
Success. Task state is saved at /Users/shiozaki/Documents/digdag_test/project/.digdag/status/20170726T000000+0000 directory.
* Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
* Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
問題のありそうな環境変数
今のところ、以下の環境変数が引き継がれることによる問題に出会いました。
HOME
embulk gemがライブラリのインストール先ディレクトリを決めるときにはHOMEを参照するようです。
そのため、以下のような記述をしたら、gemが見つからずにembulkの実行に失敗しました。
+run_embulk:
_export:
docker:
image: java:7-jre
build:
- curl --create-dirs -o /bin/embulk -L "https://dl.bintray.com/embulk/maven/embulk-0.8.25.jar"
- chmod +x /bin/embulk
- embulk gem install embulk-input-mysql embulk-output-bigquery
sh>: embulk run transfer_conf.yml
TEMPDIR
embulk-output-bigqueryではGCPのJSON keyをYAMLに直に書くこともできます。
https://github.com/embulk/embulk-output-bigquery#json-key-of-gcps-service-account
その場合は、プラグイン内で一時ディレクトリを作り、その中にJSON keyファイルを書き出す挙動を行います。
この一時ディレクトリのパスを決めるためにTEMPDIRが参照されていました。
解決策
_export
を使って、問題のある環境変数を上書きすることでこの問題を解決することができます。
例えば、上例のembulkの場合であれば、以下のように書けばOKです。
+run_embulk:
_export:
HOME: /root
docker:
image: java:7-jre
build:
- curl --create-dirs -o /bin/embulk -L "https://dl.bintray.com/embulk/maven/embulk-0.8.25.jar"
- chmod +x /bin/embulk
- embulk gem install embulk-input-mysql embulk-output-bigquery
sh>: embulk run transfer_conf.yml