DockerfileのENTRYPOINTでシェル形式を使いつつ引数を渡す
事の発端は「DockerfileのENTRYPOINT
でENV
の変数展開ができない!」でした。以下の指定は正しく動作しません。
ENTRYPOINT ["./$APP"]
CMD ["--level=0"]
そこで、下記の条件をどうにかして満たせないかと調べてみました。
ENTRYPOINT
とCMD
を使い分けるENTRYPOINT
: 実行バイナリパスCMD
: 実行バイナリに指定する引数 (docker run
時に指定)
ENTRYPOINT
でENV
の変数展開を行う- 推奨されている
exec
形式 (ENTRYPOINT
で配列の形で指定する方法) を使用する
ENVの変数展開をする為にはシェルを使用する
シェル 形式とは異なり、 exec 形式はシェルを呼び出しません。つまり、通常のシェル上の処理はされません。例えば、 ENTRYPOINT [“echo”, “$HOME”] は $HOME を変数展開しません。シェル上の処理が必要であれば、 シェル 形式を使うか、シェルを直接実行します。例: ENTRYPOINT [ “sh”, “-c”, “echo”, “$HOME” ]。変数は Dockerfile で ENV を使って定義することができ、 Dockerfile パーサー上で展開されます。
Dockerfile リファレンス - ENTRYPOINT より
リファレンスにあるように、変数展開を行う為にはこの方法(ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ]
)を使う必要があります。
しかし、この状態だとCMD
で指定した引数がsh
コマンドの引数として渡されてしまいます。
実行バイナリに引数を渡す
-c string If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.
man sh
より
そこで、この仕様をうまく使ってみることにしました。
引数を指定しない場合にも対応する為に、$0
を空文字列にし、それ以降を$@
で取得することができそうです。
まとめ
ENTRYPOINT ["sh", "-c", "./$APP $@", ""]
CMD ["--level=0"]
とすることで、CMD
で引数を渡すことができました。👏👏
記事が気に入ったらチップを送ることができます!
You can give me a cup of coffee :)
Kyash ID: soranoba
Amazon: Wish List
GitHub Sponsor: github.com/sponsors/soranoba
PayPal.Me: paypal.me/soranoba
(Updated: )