以下記事を見返して、少しわかりにくいと感じたので補足扱いの記事です。
(自分で書いておきながらって感じではありますが。。。)
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コンテナの動作を柔軟に制御することができます。
以上です。