1. 概要 Docker イメージを作成するには、次の 3 つの方法があります。
これら 3 つの方法の一般的な説明については、yeasy/docker_practice の「イメージの作成」を参照してください。 最近、Dockerfile ファイルの構成について学びました。ここでは、これまで混乱していた CMD と ENTRYPOINT 命令の簡単な概要と比較を示します。 2. Dockerfileの概要 Dockerfile はコマンドラインで構成され、# で始まるコメント行をサポートします。 一般的に、Dockerfile は、ベースイメージ情報、メンテナー情報、イメージ操作指示、コンテナ起動時に実行する指示の 4 つの部分に分かれています。
Dockerfile ファイルの最初の命令は FROM で、その後にさまざまなイメージ操作命令が続き、最後にコンテナの起動時に実行されるコマンドを指定する CMD または ENTRYPOINT が続きます。 以下は、yeasy/docker_practice の Dockerfile 内のさまざまな命令の紹介です。 命令 命令の一般的な形式は INSTRUCTION 引数であり、命令には FROM、MAINTAINER、RUN などが含まれます。 から 形式は FROM <image> または FROM <image>:<tag> です。 最初の命令は FROM 命令である必要があります。また、同じ Dockerfile 内に複数のイメージを作成する場合は、複数の FROM 命令を使用できます (イメージごとに 1 回)。 メンテナー 形式は MAINTAINER <name> で、メンテナー情報を指定します。 走る 形式は、RUN <コマンド> または RUN ["実行可能ファイル", "パラメータ1", "パラメータ2"] です。 前者はシェル端末でコマンドを実行します (つまり /bin/sh -c)。後者は exec を使用して実行されます。他の端末の使用を指定するには、RUN ["/bin/bash", "-c", "echo hello"] などの 2 番目の方法を使用します。 各 RUN 命令は、現在のイメージに基づいて指定されたコマンドを実行し、それを新しいイメージとして送信します。コマンドが長い場合は、\ を使用して折り返すことができます。 CMDF 3つのフォーマットをサポート CMD ["executable","param1","param2"] 実行には exec を使用します。これが推奨される方法です。 CMD コマンド param1 param2 は /bin/sh で実行され、対話を必要とするアプリケーションに提供されます。 CMD ["param1","param2"] は ENTRYPOINT にデフォルトのパラメータを提供します。 コンテナの起動時に実行されるコマンドを指定します。各 Dockerfile には CMD コマンドを 1 つだけ含めることができます。複数のコマンドが指定された場合は、最後のコマンドのみが実行されます。 ユーザーがコンテナの起動時に実行するコマンドを指定した場合、CMD で指定されたコマンドが上書きされます。 さらす 形式は EXPOSE <port> [<port>...] です。 相互接続されたシステムで使用するためにコンテナが公開するポート番号を Docker サーバーに伝えます。コンテナを起動するときに -P を渡す必要があり、Docker ホストは指定されたポートに転送するポートを自動的に割り当てます。 環境 形式は ENV <キー> <値> です。 後続の RUN 命令で使用され、コンテナの実行中に保持される環境変数を指定します。 例えば 環境PG_MAJOR 9.3 環境PG_バージョン9.3.4 実行 curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && … 環境変数PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH 追加 形式は ADD <src> <dest> です。 このコマンドは、指定された <src> をコンテナ内の <dest> にコピーします。 <src> は、Dockerfile が配置されているディレクトリへの相対パス、URL、または tar ファイル (ディレクトリに自動的に解凍される) にすることができます。 コピー 形式は COPY <src> <dest> です。 ローカル ホストの <src> (Dockerfile が配置されているディレクトリへの相対パス) をコンテナーの <dest> にコピーします。 ローカルディレクトリをソースディレクトリとして使用する場合は、COPY を使用することをお勧めします。 エントリーポイント 2 つの形式: ENTRYPOINT ["実行可能ファイル", "パラメータ1", "パラメータ2"] ENTRYPOINT コマンド param1 param2 (シェルで実行)。 構成コンテナの起動後に実行されるコマンドであり、docker run によって提供されるパラメータによって上書きすることはできません。 各 Dockerfile には ENTRYPOINT を 1 つだけ指定できます。複数の ENTRYPOINT を指定した場合、最後の ENTRYPOINT のみが有効になります。 音量 形式はVOLUME ["/data"]です。 ローカル ホストまたは他のコンテナーからマウントできるマウント ポイントを作成します。通常、これは、維持する必要があるデータベースやデータを保存するために使用されます。 ユーザー 形式は USER daemon です。 コンテナを実行するときにユーザー名または UID を指定します。後続の RUN でも指定されたユーザーが使用されます。 サービスに管理者権限が必要ない場合は、このコマンドを使用して実行ユーザーを指定できます。また、事前に必要なユーザーを作成することもできます。例: RUN groupadd -r postgres && useradd -r -g postgres postgres。一時的に管理者権限を取得するには、gosu を使用できますが、sudo は推奨されません。 ワークディレクトリ 形式は WORKDIR /path/to/workdir です。 後続の RUN、CMD、および ENTRYPOINT 命令の作業ディレクトリを構成します。 複数の WORKDIR ディレクティブを使用できます。後続のコマンドのパラメータが相対パスの場合、それらは前のコマンドで指定されたパスに基づきます。例えば ワークディレクトリ /a ワークディレクトリb ワークディレクトリ c 実行パスワード 最終パスは /a/b/c です。 オンビルド 形式はONBUILD [INSTRUCTION]です。 作成したイメージを他の新しく作成したイメージのベースイメージとして使用する場合に実行する操作手順を設定します。 たとえば、Dockerfile は次の内容の image-A を作成します。 [...] ONBUILD ADD ./app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src [...] image-A をベースに新しいイメージを作成し、新しい Dockerfile で FROM image-A を使用してベースイメージを指定すると、ONBUILD 命令の内容が自動的に実行され、最後に 2 つの命令を追加するのと同じになります。 FROM image-A #以下を自動的に実行します ADD . /app/src RUN /usr/local/bin/python-build --dir /app/src ONBUILD 命令を使用するイメージの場合は、タグでこれを示すことをお勧めします (例: ruby:1.9-onbuild)。 3. イメージを作成する Dockerfile ファイルを書き込んだ後、docker build コマンドを実行してカスタム イメージを作成します。 Docker ビルド コマンドの形式は次のとおりです。 docker build [オプション] <パス> このコマンドは、指定されたパス (サブディレクトリを含む) 内の Dockerfile を読み取り、パス内のすべてのコンテンツを Docker サーバーに送信して、イメージを作成します。したがって、Dockerfile を配置するディレクトリは空のディレクトリにすることが一般的に推奨されます。 .dockerignore ファイル (行ごとに一致するパターンを追加) を使用して、Docker がパスの下のディレクトリとファイルを無視するようにすることもできます。 たとえば、次の Dockerfile サンプルはイメージ test:0.0.1 を作成するために使用されます。ここで、-t オプションはイメージのタグを指定するために使用されます。 Dockerfile の内容は次のとおりです。 ubuntu:14.04から メンテナー [email protected] mkdir /opt/leh を実行します。 実行 touch /opt/leh/test CMD エコー「こんにちは lienhua34」 次に、docker build コマンドを実行してイメージ test:0.0.1 を生成します。 lienhua34@test$ sudo docker build -t test:0.0.1 。 ビルド コンテキストを Docker デーモンに送信しています 3.072 kB ステップ1: ubuntu:14.04から ---> a5a467fddcb8 ステップ2: MAINTAINER [email protected] ---> ce9e7b02f075 で実行中 ---> 332259a92e74 中間コンテナ ce9e7b02f075 を削除しています ステップ3: mkdir /opt/lehを実行します。 ---> e93f0a98040f で実行中 ---> 097e177cf37f 中間コンテナ e93f0a98040f を削除しています ステップ4: touch /opt/leh/testを実行します。 ---> f1531d3dea1a で実行中 ---> 0f68852f8356 中間コンテナ f1531d3dea1a を削除しています ステップ 5: CMD echo "Hello lienhua34" ---> cf3c5ce2af46 で実行中 ---> 811ce27ce692 中間コンテナ cf3c5ce2af46 を削除しています 811ce27ce692 の構築に成功しました 次に、イメージのコンテナを起動して結果を表示します。 lienhua34@test$ sudo dockerイメージ リポジトリ タグ イメージ ID 作成 仮想サイズ テスト 0.0.1 811ce27ce692 32 秒前 187.9 MB lienhua34@test$ sudo docker run -ti test:0.0.1 こんにちは、lienhua34 Dockerfile ファイル内の各命令はイメージのレイヤーを生成します (注: イメージは 127 レイヤーを超えることはできません)。 Dockerfile 内の命令は 1 つずつ実行されます。各ステップでは、新しいコンテナを作成し、コンテナ内で命令を実行して、変更をコミットします。すべての命令が実行されると、最終的なイメージ ID が返されます。 4. Dockerfileファイル内のCMDとENTRYPOINT命令の比較 CMD 命令と ENTRYPOINT 命令の機能は、コンテナ起動後のイメージに対するコマンドを指定することです。では、それぞれの利点は何でしょうか? CMD 命令と ENTRYPOINT 命令の違いをよりよく比較するために、ここでこれら 2 つの命令の説明を示します。 CMDF 3つのフォーマットをサポート CMD ["executable","param1","param2"] 実行には exec を使用します。これが推奨される方法です。 CMD コマンド param1 param2 は /bin/sh で実行され、対話を必要とするアプリケーションに提供されます。 CMD ["param1","param2"] は ENTRYPOINT にデフォルトのパラメータを提供します。 コンテナの起動時に実行されるコマンドを指定します。各 Dockerfile には CMD コマンドを 1 つだけ含めることができます。複数のコマンドが指定された場合は、最後のコマンドのみが実行されます。 ユーザーがコンテナの起動時に実行するコマンドを指定した場合、CMD で指定されたコマンドが上書きされます。 エントリーポイント 2 つの形式: ENTRYPOINT ["実行可能ファイル", "パラメータ1", "パラメータ2"] ENTRYPOINT コマンド param1 param2 (シェルで実行)。 構成コンテナの起動後に実行されるコマンドであり、docker run によって提供されるパラメータによって上書きすることはできません。 各 Dockerfile には ENTRYPOINT を 1 つだけ指定できます。複数の ENTRYPOINT を指定した場合、最後の ENTRYPOINT のみが有効になります。 上記の説明から、共通点が 2 つあることがわかります。
それらの違いは次のとおりです。 違い1: コンテナ起動時にCMD命令で指定したコマンドはdocker runで指定したコマンドで上書きできますが、ENTRYPOINT命令で指定したコマンドは上書きできません。代わりに、docker runで指定したパラメータがENTRYPOINTで指定したコマンドのパラメータとして使用されます。 違い 2: CMD 命令は ENTRYPOINT 命令のデフォルト パラメータを設定でき、docker run で指定されたパラメータで上書きできます。 以下、上記2つの違いについて詳しく説明します。 4.1 違い1 コンテナ起動時にCMD命令で指定したコマンドはdocker runで指定したコマンドで上書きできますが、ENTRYPOINT命令で指定したコマンドは上書きできません。代わりに、docker runで指定したパラメータがENTRYPOINTで指定したコマンドのパラメータとして使用されます。 以下は、コマンド ライン パラメータのみを出力する機能を持つ、startup という名前の実行可能シェル スクリプトです。内容は以下のとおりです。 #!/bin/bash echo "起動時、引数: $@" CMD 経由でコンテナを起動するときにコマンドを指定します。 ここで、新しい Dockerfile ファイルを作成します。このファイルは、起動スクリプトをコンテナの /opt ディレクトリにコピーし、CMD 命令によってコンテナが起動したときに起動スクリプトを実行するように指定します。その内容は以下のとおりです。 ubuntu:14.04から メンテナー [email protected] スタートアップ/optを追加する chmod a+x /opt/startupを実行します。 CMD ["/opt/startup"] 次に、docker build コマンドを実行して test:latest イメージを生成します。 lienhua34@test$ sudo docker build -t test 。 ビルド コンテキストを Docker デーモンに送信しています 4.096 kB ステップ1: ubuntu:14.04から ---> a5a467fddcb8 ステップ2: MAINTAINER [email protected] ---> キャッシュの使用 ---> 332259a92e74 ステップ3: スタートアップ/optを追加する ---> 3c26b6a8ef1b 中間コンテナ 87022b0f30c5 を削除しています ステップ4: chmod a+x /opt/startupを実行します。 ---> 4518ba223345 で実行中 ---> 04d9b53d6148 中間コンテナ 4518ba223345 の削除 ステップ5: CMD /opt/startup ---> 64a07c2f5e64 で実行中 ---> 18a2d5066346 中間コンテナ 64a07c2f5e64 を削除しています 18a2d5066346 の構築に成功しました 次に、docker run を使用して 2 つの test:latest イメージ コンテナーを起動します。最初の docker run コマンドでは、コンテナーを起動するコマンドを指定しません。2 番目の docker run コマンドでは、コンテナーを起動するコマンドを "/bin/bash -c 'echo Hello'" として指定します。 lienhua34@test$ sudo docker run -ti --rm=true テスト 起動時の引数: lienhua34@test$ sudo docker run -ti --rm=true テスト /bin/bash -c 'echo Hello' こんにちは 上記の実行結果から、docker run コマンドがコンテナを起動するときに指定した実行コマンドが、Dockerfile ファイル内の CMD 命令で指定したコマンドをオーバーライドしていることがわかります。 ENTRYPOINT でコンテナ起動時のコマンドを指定します。 上記のDockerfileのCMDをENTRYPOINTに置き換えます。内容は次のようになります。 ubuntu:14.04から メンテナー [email protected] スタートアップ/optを追加する chmod a+x /opt/startupを実行します。 エントリポイント ["/opt/startup"] 同様に、docker build を実行して test:latest イメージを生成します。 lienhua34@test$ sudo docker build -t test 。 ビルド コンテキストを Docker デーモンに送信しています 4.096 kB ステップ1: ubuntu:14.04から ---> a5a467fddcb8 ステップ2: MAINTAINER [email protected] ---> キャッシュの使用 ---> 332259a92e74 ステップ3: スタートアップ/optを追加する ---> キャッシュの使用 ---> 3c26b6a8ef1b ステップ4: chmod a+x /opt/startupを実行します。 ---> キャッシュの使用 ---> 04d9b53d6148 ステップ5: ENTRYPOINT /opt/startup ---> cdec60940ad7 で実行中 ---> 78f8aca2edc2 中間コンテナ cdec60940ad7 を削除しています 78f8aca2edc2 の構築に成功しました 次に、docker run を使用して 2 つの test:latest イメージ コンテナーを起動します。最初の docker run コマンドでは、コンテナーを起動するコマンドを指定しません。2 番目の docker run コマンドでは、コンテナーを起動するコマンドを "/bin/bash -c 'echo Hello'" として指定します。 lienhua34@test$ sudo docker run -ti --rm=true テスト 起動時の引数: lienhua34@test$ sudo docker run -ti --rm=true テスト /bin/bash -c 'echo Hello' 起動時、引数: /bin/bash -c echo Hello 上記の実行結果から、docker run コマンドで指定したコンテナ実行コマンドは、Dockerfile ファイル内の ENTRYPOINT 命令で指定したコマンドを上書きできず、ENTRYPOINT 命令で指定したコマンドにパラメータとして渡されていることがわかります。 4.2 違い2 CMD 命令は ENTRYPOINT 命令のデフォルト パラメータを設定でき、docker run で指定されたパラメータで上書きできます。 上記と同じ起動スクリプトを使用します。 Dockerfileを記述します。内容は以下のとおりです。 ubuntu:14.04から メンテナー [email protected] スタートアップ/optを追加する chmod a+x /opt/startupを実行します。 エントリポイント ["/opt/startup", "arg1"] コマンド ["arg2"] docker build コマンドを実行して、test:latest イメージを生成します。 lienhua34@test$ sudo docker build -t test 。 ビルド コンテキストを Docker デーモンに送信しています 4.096 kB ステップ1: ubuntu:14.04から ---> a5a467fddcb8 ステップ2: MAINTAINER [email protected] ---> キャッシュの使用 ---> 332259a92e74 ステップ3: スタートアップ/optを追加する ---> キャッシュの使用 ---> 3c26b6a8ef1b ステップ4: chmod a+x /opt/startupを実行します。 ---> キャッシュの使用 ---> 04d9b53d6148 ステップ5: ENTRYPOINT /opt/startup arg1 ---> 54947233dc3d で実行中 ---> 15a485253b4e 中間コンテナ54947233dc3dの削除 ステップ6: CMD arg2 ---> 18c43d2d90fd で実行中 ---> 4684ba457cc2 中間コンテナ 18c43d2d90fd を削除しています 4684ba457cc2 の構築に成功しました 次に、docker run を実行して、2 つの test:latest イメージ コンテナを起動します。最初の docker run コマンドではパラメータを指定せず、2 番目の docker run コマンドではパラメータ arg3 を指定します。結果は次のようになります。 lienhua34@test$ sudo docker run -ti --rm=true テスト 起動時の引数: arg1 arg2 lienhua34@test$ sudo docker run -ti --rm=true テスト引数3 起動時の引数: arg1 arg3 上記の最初のコンテナの実行結果から、CMD 命令が ENTRYPOINT 命令のデフォルト パラメータを設定することがわかります。2 番目のコンテナの実行結果から、docker run コマンドで指定されたパラメータが CMD 命令で指定されたパラメータを上書きすることがわかります。 4.3 注記 CMD 命令は、同じ Dockerfile ファイル内にあるかどうかではなく、イメージ階層に基づいて ENTRYPOINT 命令のデフォルト パラメータを提供します。つまり、Dockerfile がベースイメージの ENTRYPOINT で指定された起動コマンドを指定する場合、Dockerfile の CMD はベースイメージの ENTRYPOINT のデフォルトパラメータを設定します。 たとえば、次の Dockerfile があります。 ubuntu:14.04から メンテナー [email protected] スタートアップ/optを追加する chmod a+x /opt/startupを実行します。 エントリポイント ["/opt/startup", "arg1"] docker build コマンドを実行して test:0.0.1 イメージを生成し、イメージ用のコンテナーを作成して実行結果を表示します。 lienhua34@test$ sudo docker build -t test:0.0.1 。 ビルドコンテキストを Docker デーモンに送信 6.144 kB ステップ1: ubuntu:14.04から ---> a5a467fddcb8 ステップ2: MAINTAINER [email protected] ---> 57a96522061a で実行中 ---> c3bbf1bd8068 中間コンテナ57a96522061aの取り外し ステップ3: スタートアップ/optを追加する ---> f9884fbc7607 中間コンテナ 591a82b2f382 を削除しています ステップ4: chmod a+x /opt/startupを実行します。 ---> 7a19f10b5513 で実行中 ---> 16c03869a764 中間コンテナ 7a19f10b5513 を削除 ステップ5: ENTRYPOINT /opt/startup arg1 ---> b581c32b25c3 で実行中 ---> c6b1365afe03 中間コンテナ b581c32b25c3 を削除しています c6b1365afe03 を正常に構築しました lienhua34@test$ sudo docker run -ti --rm=true テスト:0.0.1 起動時の引数: arg1 次に、新しい Dockerfile ファイルを作成します。ベース イメージは、新しく生成された test:0.0.1 です。CMD を使用して、echo を通じて文字列 "in test:0.0.2" を出力するように指定します。ファイルの内容は次のとおりです。 テスト:0.0.1から メンテナー [email protected] CMD ["/bin/bash", "-c", "テストでエコー:0.0.2"] docker build コマンドを実行して test:0.0.2 イメージを生成し、次に docker run を実行して test:0.0.2 イメージのコンテナーを起動し、結果を表示します。 lienhua34@test$ sudo docker build -t test:0.0.2 。 ビルドコンテキストを Docker デーモンに送信 6.144 kB ステップ1: FROM test:0.0.1 ---> c6b1365afe03 ステップ2: MAINTAINER [email protected] ---> deca95cf4c15 で実行中 ---> 971b5a819b48 中間コンテナ deca95cf4c15 の削除 ステップ 3: CMD /bin/bash -c echo in test:0.0.2 ---> 4a31c4652e1e で実行中 ---> 0ca06ba31405 中間コンテナ 4a31c4652e1e を削除しています 0ca06ba31405 を正常に構築しました lienhua34@test$ sudo docker run -ti --rm=true テスト:0.0.2 起動時、引数: arg1 /bin/bash -c echo in test:0.0.2 上記の結果から、イメージ test:0.0.2 によって起動されたコンテナが実行中の場合、「in test:0.0.2」という文字列は出力されませんが、CMD 命令で指定されたコマンドが、ベースイメージ test:0.0.1 内の ENTRYPOINT で指定された実行スクリプト起動のパラメータとして使用されていることがわかります。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Reactは動的ポップアップウィンドウコンポーネントを実装します
>>: MySQL ストレージエンジン InnoDB の設定と使用方法の説明
1. 概要information_schema データベースは performance_schema...
目次説明する:要約する補充するDOM を直接変更して操作する js や jQuery とは異なり、V...
クリックハウスの紹介ClickHouse は、SQL クエリを使用して分析データ レポートをリアルタ...
1. 使用法: (1)EXISTSの使用 ucsc_project_batch a から、存在する場...
<tbody> タグは、テーブル本体のスタイルを定義するために使用されます。基本構文 &...
基本的な紹介特徴Flexbox は、よりシンプルで効率的なレイアウト方法を提供する CSS 表示タイ...
状況の説明: データベースが異常に起動およびシャットダウンしたため、サービスを再度起動したときに「起...
目次ユースケースリアクティブAPI関連プロセス反応的なcreateReactiveObjectはレス...
この記事では、フォーム検証を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は...
コンセプトインデックスにクエリ要件を満たすすべてのデータが含まれている場合、それはカバーリング イン...
この記事では、ブロック崩しピンボールゲームを実装するためのJSの具体的なコードを参考までに紹介します...
設置環境1. gccのインストールnginxをインストールするには、まず公式サイトからダウンロードし...
1. Alipay方式: Alipay メソッド: Alipay をクリックして支払い、バックエンド...
mysqlに接続できない問題の解決方法を参考までに紹介します。具体的な内容は以下のとおりです。昨日は...
データのバックアップと復元パート2は次のとおりです基本的な概念:バックアップ、現在のデータまたはレコ...