Edited at

digdag の docker.run_options を少しだけ試した


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 と宣言された ImmutableListaddAll されています。

この変数 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 による実行なので、問題あるんだよって話でした。

「そらそうよ。だから配列なんやで。」 って感じですかね。

何か間違っている点等がありましたら、ご指摘いただけると幸いです。