GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

DockerイメージのCMDとENTRYPOINTの違い

CMD およびENTRYPOINT 命令は、よく混同される2つのDockerfile ディレクティブ。どちらも、コンテナの起動時に実行されるコマンドを決定する役割があります。

CMD およびENTRYPOINT 各画像内で個別に上書きできます。これらのディレクティブを効果的に使用すると、提供するコマンドの長さが短くなり、コンテナーが使いやすくなります。

エントリポイントとは何ですか?

ENTRYPOINTを見ていきます CMDの前に処理されるため最初に 新しいコンテナを起動するとき。イメージのエントリポイントは、コンテナの起動時に実行されるプロセスを定義します。

Dockerは、エントリポイントをデフォルトで/bin/sh -cに設定します 。これは、コンテナを起動したときにシェルセッションが終了することを意味します。多くのコンテナでは、デフォルトで別のプロセスを起動することがより望ましいです。ヘッドレスサービスでワークロードをすぐに開始する必要があります。

ENTRYPOINTの設定 Dockerfileのディレクティブ コンテナの起動時に特定のコマンドを実行するようにDockerに指示します。デフォルトのシェルセッションではなく、フォアグラウンドプロセスになります。

ENTRYPOINT ["date"]

このDockerfileで作成されたコンテナ dateを実行します 指図。 dateとして は長続きする前景プロセスではないため、コンテナはすぐに終了します。

エントリポイントは、実行可能なバイナリまたはスクリプトである必要があります。無効なエントリポイントを指定すると、コンテナは起動しません。カスタムスクリプトを使用している場合は、実行可能ビットが設定されていることを確認してください。 chmod +x my-script.shを使用して実行権限を追加できます 。

コマンドの追加(CMD)

CMD 指示は誤称のようなものです。 ENTRYPOINTで定義されたコマンドのデフォルトの引数を提供します 。

ENTRYPOINT ["date"]
CMD ["+%A"]

この例では、コンテナでdate +%Aが実行されます。 。 +%A dateへの引数 現在の曜日を表示します(例:Monday

CMD オーバーライドされるように設計されています。 docker run 個々のコンテナインスタンスに別のコマンドを指定できます:

docker run my-image +%B

デフォルトのCMD +%Bで上書きされます 、コンテナに現在の月の名前を表示させます。これは、画像のエントリポイントがそのまま残るために機能します。 CMD 常にENTRYPOINTに追加されます 、したがって、最後のコマンドはdate +%Bになります 。

ENTRYPOINTを使用する必要があります コンテナのプライマリ実行可能ファイルを定義します。 CMDを使用する その実行可能ファイルのデフォルト引数を定義します。コンテナが異なる引数で実行されると、オーバーライドされます。

エントリポイントのオーバーライド

カスタムエントリポイントを使用して、Dockerにイメージを開始させることができます。 --entrypointを渡します docker runへのフラグ :

docker run --entrypoint /bin/sh my-image

コンテナのイメージで定義されたエントリポイントは無視され、指定したコマンドが優先されます。この例では、dateの代わりにシェルセッションが開始されます コマンド。

エントリポイントのオーバーライドはまれにしか発生しません。画像の作者の意図に反する可能性があります。ただし、カスタムエントリポイントの設定は、特にデバッグ時に役立つ場合があります。コンテナの誤動作が発生した場合、そのエントリポイントを上書きすると、他の方法では取得できないシェルアクセスが許可される可能性があります。

どちらを使用しますか?

画像の作成者の場合は、ENTRYPOINTを使用する必要があります コンテナの実行内容を定義するとき。デフォルトの引数を提供したいが、ユーザーがそれらをオーバーライドすることを期待する場合は、CMDを含めます

画像ユーザーは、通常、CMDのオーバーライドに固執することができます 。 docker run コマンドオーバーライドを透過的にサポートします。画像名の後に指定された引数は、CMDとして解釈されます。 コンテナの文字列。

エントリポイントモード:シェルまたはExec

Dockerは、実際には2つの異なる形式のENTRYPOINTをサポートしています。 :execモードとシェルモード。 Execモードは、配列構造を使用してパラメーターを指定することを特徴としています。シェルモードでは、コマンドは1つの文字列として指定されます。

# exec mode
ENTRYPOINT ["binary", "--param", "--another-param"]

# shell mode
ENTRYPOINT binary --param --another-param

シェルモードを使用すると、バイナリが/bin/sh -cのサブプロセスとして実行されます。 。これにより、シェルによって定義された環境変数へのエントリポイントアクセスが可能になります。

ただし、シェルモードにはトレードオフがあります。 CMDは使用できません そのため、ユーザーはオーバーライドを発行できなくなります。 docker runに与えられた引数 無視されます。コンテナは常にエントリポイントをそのまま使用します。

バイナリはシェル内で実行されるため、docker stopなどのDockerライフサイクルコマンド 不規則に動作するか、まったく動作しない可能性があります。 Dockerはシェルに信号を送ります 内のプロセスの代わりに停止します。 execを使用してプロセスを起動できます これを避けるために。

ENTRYPOINT exec binary --param --another-param

Dockerのエントリポイントアプローチのメリット

エントリポイントを引数から分離すると、コンテナの複雑さを隠すのに役立ちます。これは、CLIプログラムをカプセル化するユーティリティコンテナを作成する場合に最も役立ちます。

CLIのバイナリを画像のエントリポイントとして設定します。これにより、ユーザーは各コマンドでバイナリ名を繰り返すことなく対話できます。

上記のDockerfileをパッケージ化したかどうかを検討してください date:latestとして :

# default entrypoint (/bin/sh -c)
docker run date:latest date +%A

# with `date` as the entrypoint
docker run date:latest +%A`

カスタムエントリポイントを設定すると、コマンドが短縮され、繰り返しが減ります。 dateを呼び出すことで、コンテナはより特殊化されます 自動的。これにより、ユーザーにとってより使いやすいインターフェースが作成されます。

概要

DockerのENTRYPOINT およびCMD 指示はしばしば混乱の原因になります。それらの命名は、それらの意図された目的を覆い隠します。

ENTRYPOINTを使用する 新しいコンテナの起動時に実行される「コマンド」を設定します。 CMDを使用してデフォルトの引数を定義できます 。 ENTRYPOINT およびCMD 一緒に組み合わせて、コンテナの最終的なコマンド文字列を生成します。

docker runを使用する場合 、DockerはイメージのデフォルトのCMDを置き換えます 指定した引数を使用します。画像のエントリポイントを上書きする必要がある場合は、--entrypointを使用してください フラグ。


Docker
  1. InnoDBとMyISAMの違いは何ですか?

  2. LXC、LXD、Dockerコンテナの違いは何ですか

  3. Linuxコンテナとイメージの違いは何ですか?

  1. Sudo Su –とSudo Su —の違いは何ですか?

  2. NssとPamの違いは?

  3. SudoとGksuの違いは、Sudo-iとSudo-sの違いと同じですか?

  1. podmanとdockerの違い。

  2. [[$ a ==Z*]]と[$a==Z *]の違いは?

  3. ls と l はどう違いますか?