自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Docker】Dockerfileで記述するRUNとCMDとENTRYPOINTの違いについて_補足

以下記事を見返して、少しわかりにくいと感じたので補足扱いの記事です。

(自分で書いておきながらって感じではありますが。。。)

www.guri2o1667.work

RUN

RUN 命令は、Dockerイメージがビルドされる際に実行される命令です。

主に、パッケージのインストールや設定ファイルの編集など、イメージの構築に必要なコマンドを実行するために使われます。

RUN で実行されたコマンドの結果は、イメージに反映され保存されます。

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx

この例では、UbuntuベースのイメージにNginxをインストールしています。

CMD

CMD 命令は、コンテナが実行される際にデフォルトで実行されるコマンドを指定します。

Dockerfile内には一つの CMD 命令のみが有効で、複数ある場合は最後の CMD が使用されます。

CMD は、コンテナ起動時のデフォルトの挙動を定義しますが、コマンドラインから異なるコマンドを指定すれば上書きすることができます。

FROM ubuntu:20.04
CMD ["echo", "Hello World"]

この例では、コンテナが起動すると「Hello World」と出力します。

ENTRYPOINT

ENTRYPOINT 命令は、コンテナが実行される際に常に実行されるコマンドを指定します。

CMD と異なり、ENTRYPOINT で指定されたコマンドはコマンドラインからの指定で上書きされることはありません

ただし、ENTRYPOINT の後に続くコマンドライン引数は、ENTRYPOINT の引数として追加されます。

FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]

この例では、コンテナが起動すると「Hello World」と出力します。

ただし、docker run [イメージ名] New World のように実行すると、「Hello New World」と出力されます。

ここまでのまとめ

  • RUN はイメージビルド時に実行され、その結果がイメージに保存されます。
  • CMD はコンテナ起動時のデフォルトコマンドを指定しますが、上書き可能です。
  • ENTRYPOINT はコンテナ起動時に常に実行されるコマンドを指定し、CMD と組み合わせて使うことが一般的です。

CMD と ENTRYPOINT の詳細解説

CMD

  • CMD 命令は、コンテナが起動する際のデフォルトコマンドを指定します。
  • Dockerfile内には一つの CMD 命令のみが有効です。
  • CMD は、コンテナ起動時に上書きすることが可能です。つまり、docker run [イメージ名] [コマンド] の形で新たなコマンドを指定すれば、CMD で指定されたコマンドは無視されます。
  • CMD は、引数やコンテナの実行コマンドのデフォルト値を提供するのに最適です。

ENTRYPOINT

  • ENTRYPOINT 命令は、コンテナが実行される際に常に実行されるコマンドを指定します。
  • ENTRYPOINT で指定されたコマンドは、コンテナ起動時に上書きされません。
  • ENTRYPOINT の後に続くコマンドライン引数は、ENTRYPOINT の引数として追加されます。これにより、コンテナが特定のコマンドやアプリケーションとして動作するように設定できます。

CMD と ENTRYPOINT の同時使用サンプル1

FROM ubuntu:20.04
ENTRYPOINT ["echo"]
CMD ["Hello World"]

このDockerfileでは、コンテナが起動するとデフォルトで「Hello World」と出力します。

もし、docker run [イメージ名] New World のように実行すると、「New World」と出力されます。

CMD と ENTRYPOINT の同時使用サンプル2

FROM python:3.8-slim
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["app.py"]

このサンプルでは、Pythonアプリケーションをコンテナ化しています。

ENTRYPOINT でPythonインタープリタを指定し、CMD で実行するPythonスクリプト(ここでは app.py)を指定しています。

コンテナを起動する際に別のスクリプトを指定すれば、そのスクリプトが実行されます。

例えば、docker run [イメージ名] another_script.py とすると、another_script.py が実行されます。

CMD と ENTRYPOINT の同時使用サンプル3

FROM debian:buster
ENTRYPOINT ["/bin/bash", "-c"]
CMD ["echo Welcome to the container!"]

このサンプルでは、コンテナの起動時にbashシェルを使用して特定のコマンドを実行するように設定しています。

ENTRYPOINT/bin/bash -c を指定し、CMD で実行するコマンド(この例では echo Welcome to the container!)を指定しています。

コンテナを起動する際に別のコマンドを渡すことで、そのコマンドがbashによって実行されます。

例えば、docker run [イメージ名] "echo Another command" とすると、「Another command」と出力されます。

CMD と ENTRYPOINT の使い分けパターン(表形式)

パターン CMD 使用 ENTRYPOINT 使用 説明
デフォルトコマンド × コンテナ起動時のデフォルトコマンドを指定。起動時に上書き可能。
コマンド固定 × コンテナが特定のコマンドで常に実行されるように設定。起動時に上書き不可。
コマンド+デフォルト引数 ENTRYPOINT でコマンドを固定し、CMD でデフォルト引数を提供。引数は上書き可能。

これらの使い分けにより、Dockerコンテナの動作を柔軟に制御することができます。

以上です。