digdag の docker.run_options
digdagのバージョン 0.9.37
から docker に関する オプションが使えるようになったようです。
リリースノート : https://docs.digdag.io/releases/release-0.9.37.html?highlight=run_options
該当PR : https://github.com/treasure-data/digdag/pull/1025
PR の方から引用すると、以下のように設定できるみたいです。
_export:
docker:
image: ruby:2.5.1
build:
- apt install vim
docker: /usr/local/bin/nvidia-docker
run_options: ["-v", "/tmp:/tmp"]
build_options: ["--pull"]
ここの run_options: ["-v", "/tmp:/tmp"]
ですが、 run_options: ["-v /tmp:/tmp"]
みたいにできないものか と思って試したら
docker: Error response from daemon: create /: " /" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
ってエラーが出るので出来なかったよ って話です (build_options
でも同様ですね.)
digdag の DEBUGログを見てみる
digdag run -l debug
で デバッグログを出力することができます。
-
run_options: ["-v", "/tmp:/tmp"]
のときに実行されるコマンド
2019-08-30 19:19:07 +0900 [DEBUG] (0017@[0:default]+sample_wf+sample_docker_run_options) io.digdag.standards.command.DockerCommandExecutor: Running in docker: docker run -v /tmp:/tmp -i --rm -v ..略
-
run_options: ["-v /tmp:/tmp"]
のときに実行されるコマンド
2019-08-30 19:20:22 +0900 [DEBUG] (0017@[0:default]+sample_wf+sample_docker_run_options) io.digdag.standards.command.DockerCommandExecutor: Running in docker: docker run -v /tmp:/tmp -i --rm -v ..略
DEBUGログに表示される docker
コマンドは全く一緒で、 どちらもコマンド的には問題なさそう。
コマンドだけをコピって ローカルのターミナルで実行すると実行できます。
上記の docker: Error response from daemon
みたいなエラーは出ません。
ではなぜ出来ないか
run_options
は この部分 で command
と宣言された ImmutableList
に addAll
されています。
この変数 command
は最終的に ProcessBuilder docker = new ProcessBuilder(command.build());
として ProcessBuilder
に渡されます。
ProcessBuilder
はプロセスの実行前にコマンドを一つにつなげる訳でもなく、command.toArray(new String[command.size()]);
とするので、run_options: ["-v /tmp:/tmp"]
と定義してしまうと、それが一つのコマンドとして入力されてしまうんですねぇ..?
つまり、イメージ的には
-
run_options: ["-v", "/tmp:/tmp"]
のときに実行されるコマンド
"docker" "run" "-v" "/tmp:/tmp" "nannka-image:0.1"
-
run_options: ["-v /tmp:/tmp"]
のときに実行されるコマンド
"docker" "run" "-v /tmp:/tmp" "nannka-image:0.1"
※ 上記を実行すると docker: Error response from daemon
が発生します.
まとめ
DEBUG ログでは、
logger.debug("Running in docker: {} {}", command.build().stream().collect(Collectors.joining(" ")), imageName);
とされてたので、run_options: ["-v /tmp:/tmp"]
でも問題ないように見えたんですが、実際には ProcessBuilder
による実行なので、問題あるんだよって話でした。
「そらそうよ。だから配列なんやで。」 って感じですかね。
何か間違っている点等がありましたら、ご指摘いただけると幸いです。