理由
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