Docker でコマンド実行の CLI を作る場合は ENTRYPOINT で実行コマンドを書き、CMD で実行オプション等の引数を渡すようにする

理由

CMD に実行コマンドを書くと、引数が使えなくなるからです。docker run 時に与えた引数は、CMD を上書きしてしまうからです

実行コマンドは ENTRYPOINT に書きましょう。

具体例

foo というコマンドを Docker で実行したいとします。完成形は以下のような形です。

$ docker run --rm hoge/foo:latest -first bar -second fuga

だめな Dockerfile の例

このコマンド用のイメージを作るための Dockerfile が以下のようになっていると、期待通りに動作しません。

FROM ubuntu:20.04

# 中略

CMD ["/usr/local/bin/my_cli"]

なぜ上記でダメかというと、先ほどの docker run コマンドでの -first bar -second fuga の部分が CMD を上書きしてしまうからです。すなわち以下のようなコマンドを実行するのと同等になってしまいます。

$ -first bar -second fuga

OK な Dockerfile の例

期待通りに動作させるには、ENTRYPOINT に実行コマンドを書きます。例えば以下のようになります。

FROM ubuntu:20.04

# 中略

ENTRYPOINT ["/usr/local/bin/my_cli"]

これで先ほどの docker run コマンドを実行すると、実質的には以下のコマンドをコンテナ内で実行したのと同じになります。期待通りの動作かと思います。

$ /usr/local/bin/my_cli -first bar -second fuga
Powered by はてなブログ