docker の run/cmd/entrypoint の違いの詳細な説明

docker の run/cmd/entrypoint の違いの詳細な説明

Dockerfile では、run、cmd、entrypoint はすべてコマンドを実行するために使用できます。主な用途は次のとおりです。

  • 実行コマンドはコマンドを実行し、通常はソフトウェアパッケージのインストールに使用される新しいイメージレイヤーを作成します。
  • cmdコマンドはコンテナの起動後に実行されるデフォルトのコマンドとそのパラメータを設定しますが、CMDで設定されたコマンドはdocker runコマンドの後のコマンドラインパラメータで置き換えることができます。
  • コンテナの起動時に実行されるエントリポイント構成コマンドは、 docker run実行時に他のコマンドが指定されている場合でも無視されずに実行されます。

Shell および Exec 形式でコマンドを実行する

run、cmd、entrypoint で実行するコマンドは、次の 2 つの形式で指定できます。

  • シェルの形式: .例えば: yum install -y wget
  • 実行形式: ["executable", "param1", "param2", …]。例: [“yum”、“install”、“-y”、“wget”]

どちらの形式も run では使用できますが、命令がより読みやすく理解しやすいため、cmd と entrypoint には exec 形式を使用することをお勧めします。

実行形式の落とし穴

dockerfile の内容は次のとおりです。

環境名モリス

エントリポイント ["echo", "$name"]

この書き方では、シェルではなく echo コマンドのみが実行されるため、$name のみが出力され、変数は置き換えられません。これは、シェルで echo を実行しているのではなく、単に echo を実行しているだけなので、変数は置き換えられないことを意味します。

実行可能なシェルに変更するには、次の形式に書き直す必要があります。

環境名モリス

エントリポイント ["/bin/bash", "-c", "echo $name"]

コマンドの実行

run コマンドは、アプリケーションやソフトウェア パッケージをインストールするときによく使用されます。 run は現在のイメージ上でコマンドを実行し、新しいイメージ レイヤーを作成します。 Dockerfile には複数の実行命令が含まれることがよくあります。次に例を示します。

yum update && yum install -y \ を実行します。  
 bzr \
 cvs \
 git \
 気まぐれな\
 転覆

yum update と yum install は 1 つの実行コマンドで実行されるため、毎回最新のパッケージがインストールされます。 yum install を別途実行した場合、yum update によって作成されたイメージ レイヤーが使用されますが、これはかなり前にキャッシュされている可能性があります。

cmd コマンド

cmd ディレクティブを使用すると、ユーザーはコンテナによって実行されるデフォルトのコマンドを指定できます。このコマンドは、コンテナが起動され、docker run で他のコマンドが指定されていない場合に実行されます。次に例を示します。

cmd echo "こんにちは世界"

コンテナdocker run -it [image]を実行すると、次の出力が出力されます。

こんにちは世界

ただし、その後にdocker run -it [image] echo hiなどのコマンドが追加されると、cmd は無視され、コマンドecho hiが実行されます。

こんにちは

cmd コマンドが複数ある場合は、最後の cmd コマンドのみが実行されます。

エントリポイントコマンド

エントリポイントの exec 形式は、コンテナの起動時に実行されるコマンドとそのパラメータを設定するために使用されます。追加のパラメータは、cmd コマンドまたはコマンドラインパラメータを通じて提供できます。エントリポイント内のパラメータは常に使用されます。これは cmd コマンドとは異なります。次に例を示します。

エントリポイント ["echo", "Hello"]

docker run -it [image]経由でコンテナを起動すると、出力は次のようになります。

こんにちは

docker run -it [image] morrisで起動した場合、出力は次のようになります。

こんにちはモリス

別の例を見てみましょう。Dockerfile は次のとおりです。

エントリポイント ["echo", "Hello"]
cmd ["世界"]

docker run -it [image]経由でコンテナを起動すると、出力は次のようになります。

こんにちは世界

docker run -it [image] morrisで起動すると、出力は次のようになります。

こんにちはモリス

エントリポイント内のパラメータは常に使用されますが、cmd の追加パラメータはコンテナの起動時に動的に置き換えられます。

同様に、エントリポイント コマンドが複数ある場合は、最後のエントリポイント コマンドのみが実行されます。

要約する

  • 実行コマンドを使用して、アプリケーションとソフトウェア パッケージをインストールし、イメージをビルドします。
  • Docker イメージの目的が、MySQL の実行など、アプリケーションまたはサービスを実行することである場合、最初に Exec 形式のエントリポイント命令を使用する必要があります。 cmd はエントリポイントの追加のデフォルト パラメータを提供でき、デフォルト パラメータは docker run コマンドラインで置き換えることができます。
  • コンテナのデフォルトの起動コマンドを設定する場合は、cmd コマンドを使用します。ユーザーは、docker run コマンドラインでこのデフォルト コマンドを置き換えることができます。

docker の run/cmd/entrypoint の違いについての記事はこれで終わりです。docker run/cmd/entrypoint に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • docker CMD/ENTRYPOINT が sh スクリプトを実行する問題の解決策: not found/run.sh:
  • docker run後に複数のコマンドを実行する
  • Ubuntu vps が docker をインストールし、エラーを報告します: unix:///var/run/docker.sock の Docker デーモンに接続できません。問題は解決しました
  • DockerはCMDまたはENTRYPOINTコマンドを使用して複数のサービスを同時に起動します
  • Dockerfile の CMD および ENTRYPOINT コマンドの詳細な説明

<<:  ビジュアルデザイナーの成長の3つの段階のまとめ

>>:  Python の MySQL データベース LIKE 演算子の詳細な説明

推薦する

順序再構築に関する簡単な説明: MySQL シャーディング

目次1. 目的2. 環境整備1. 基本情報2. データベース環境の準備3. データベースを構築し、サ...

MySQL トリガー構文とアプリケーション例

この記事では、例を使用して MySQL トリガーの構文とアプリケーションを説明します。ご参考までに、...

MySQLシリーズ マルチテーブル結合クエリ92および99構文例詳細チュートリアル

目次1. デカルト積現象2. 接続クエリの知識ポイントのまとめ1) 結合クエリとは何ですか? 2) ...

ネイティブ JS オブジェクト指向タイピング ゲーム

この記事では、JSオブジェクト指向タイピングゲームの具体的なコードを参考までに紹介します。具体的な内...

入力選択スタイルを変更する CSS 疑似クラスのサンプルコード

注: この表はW3Schoolチュートリアルから引用したものです疑似要素の分類と機能: 入力選択スタ...

Pure CSS と Flutter はそれぞれブリージング ライト効果を実現します (サンプル コード)

前回、非常に熱心なファンから、月を呼吸する光の効果にできるかどうか尋ねられました。月の大きさの写真が...

Vueのスロットの詳細な説明

Vue でのコードの再利用により、mixnis が提供されます。テンプレートの再利用により、スロット...

CentOS で新しいユーザーを作成し、キーログインを有効にする方法

目次新しいユーザーを作成する新規ユーザーを承認する新規ユーザーのSSHキーログインを有効にする他のS...

ミニプログラムカスタムタブバーコンポーネントのカプセル化

この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...

Mac で MySQL バージョン 5.6 のパスワードを設定する方法

MySQLはインストール時に設定できますが、それより低いバージョンは設定できないようで、インストール...

HTML テーブルタグチュートリアル (21): 行の境界線の色属性 BORDERCOLOR

テーブルを美しくするために、行ごとに異なる境界線の色を設定できます。基本的な構文<TR 境界線...

MySQLデータファイルの保存場所を表示する方法

次のような疑問が湧くかもしれません。MySQLをローカル (自分のコンピュータ) にインストールした...

Vue ブラウザログアウトの実装例

目次1. beforeunload イベント2. アンロードイベント3. ソースコードプロジェクトの...

JavaScript ベースのシンプルな計算機の実装

この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...

Docker データ ストレージ ボリュームの詳細な説明

デフォルトでは、コンテナ データの読み取りと書き込みはコンテナのストレージ レイヤーで行われます。コ...