はじめに
コンテナは特定のタスクとプロセスを実行するために設計されています 、オペレーティングシステムをホストするためではありません。単一のユニットタスクを提供するコンテナを作成します。 指定されたタスクを完了すると、停止します 。したがって、コンテナのライフサイクルは、コンテナ内で進行中のプロセスに依存します。プロセスが停止すると、コンテナも停止します。
Dockerfileはこのプロセスを定義します。これは、Dockerイメージを構築する方法に関する指示で構成されたスクリプトです。このスクリプトには、2種類の指示があります コンテナで実行されているプロセスを定義できます:
- エントリポイント
- CMD
この記事では、Docker ENTRYPOINTとCMDの違いと、どのDocker命令をいつ使用するかについて説明します。
DockerエントリポイントとCMD:ジレンマの解決
つまり、 CMD コンテナのデフォルトのコマンドやパラメータを定義します。 CMDは、ユーザーが簡単にオーバーライドできるデフォルトのコマンドが必要な場合に使用するのに最適な命令です。 Dockerfileに複数のCMDがある場合、最後のCMDからの命令のみが適用されます。
一方、 ENTRYPOINT 特定の実行可能ファイルでコンテナを定義する場合に適しています。 --entrypoint
を追加しない限り、コンテナの起動時にENTRYPOINTをオーバーライドすることはできません。 フラグ。
ENTRYPOINTとCMDを組み合わせる 指定された実行可能ファイルと簡単に変更できるデフォルトのパラメータを持つコンテナが必要な場合。たとえば、アプリケーションをコンテナ化する場合は、 ENTRYPOINTを使用します およびCMD 環境固有の変数を設定します。
シェルおよび実行フォーム
始める前に、指示の形式について話し合うことが重要です。 Docker ENTRYPOINTとCMDには、次の2つの形式があります。
- シェルフォーム
- 実行フォーム
シェル形式のコマンドの構文は次のとおりです。
<instruction> <command>
exec形式の命令の構文は次のとおりです。
<instruction> ["executable", "parameter"]
Docker CMD / ENTRYPOINT命令は、次の両方の形式で記述できます。
-
CMD echo "Hello World"
(シェルフォーム) -
CMD ["echo", "Hello World"]
(実行フォーム) -
ENTRYPOINT echo "Hello World"
(シェルフォーム) -
ENTRYPOINT ["echo", "Hello World"]
(実行フォーム)
ただし、すべての指示はexec形式のままにしてください。 潜在的なパフォーマンスの問題を防ぐため。
Docker CMD
Docker CMD Dockerイメージのデフォルトの実行可能ファイルを定義します。コマンドライン引数を追加せずに、このイメージをコンテナのベースとして実行できます。その場合、コンテナはCMDコマンドで指定されたプロセスを実行します。
CMD命令は、 run
に引数が追加されていない場合にのみ使用されます。 コンテナを起動するときのコマンド。したがって、コマンドに引数を追加すると、CMDが上書きされます。
CMDがどのように機能するかを示すために、CMD命令を使用してサンプルコンテナを作成します。
CMDを使用したDockerfileの作成とイメージの構築
1.新しいMyDockerImage
を作成することから始めます 画像を保存するフォルダ:
sudo mkdir MyDockerImage
2.そのフォルダーに移動し、新しいDockerfileを作成します:
cd MyDockerImage
sudo touch Dockerfile
3.お気に入りのテキストエディタでDockerfileを開きます:
nano Dockerfile
4.次に、次のコンテンツをファイルに追加します。
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
CMD ["echo", "Hello World"]
上記のコンテンツでは、CMD命令を使用してメッセージ Hello World
をエコーしたことがわかります。 コンテナが指定されたコマンドなしで起動したとき。
5.保存 および終了 ファイル。
6.次のステップは、新しく作成されたDockerfileからDockerイメージを構築することです。まだMyDockerImage
にいるので ディレクトリの場合、Dockerfileの場所を指定する必要はありません。次のコマンドを実行して、イメージをビルドするだけです。
sudo docker build .
7.出力にはコンテナの名前が表示されます。次のコマンドを実行して、ローカルに保存されている画像で利用できるかどうかを確認できます。
sudo docker images
CMDを使用したDockerコンテナの実行
CMDの動作を確認するために、前の手順で作成したイメージに基づいてコンテナを作成します。
次のコマンドでコンテナを実行します:
sudo docker run [image_name]
コマンドライン引数がないため、コンテナはデフォルトのCMD命令を実行し、 Hello World
を表示します。 メッセージ。ただし、コンテナの起動時に引数を追加すると、CMD命令が上書きされます。
たとえば、hostname引数をdockerrunコマンドに追加します。
sudo docker run [image_name] hostname
Dockerはコンテナとhostname
を実行します CMDのechoコマンドの代わりにコマンド。これは出力で確認できます。
Dockerエントリポイント
ENTRYPOINTは、コンテナーの実行方法を構成するために使用されるもう1つの命令です。 CMDの場合と同様に、コマンドとパラメーターを指定する必要があります。
CMDとENTRYPOINTの違いは何ですか? docker run
にコマンドラインパラメータを追加して、ENTRYPOINT命令を上書きすることはできません。 指図。この指示を選択することにより、コンテナがそのような使用のために特別に構築されていることを意味します。
コンテナの作成にENTRYPOINTを適用する方法を確認するために読んでください。
ENTRYPOINTを使用したDockerfileの作成とイメージの構築
1. CMDセクションで作成されたDockerfileを使用し、ファイルを編集して命令を変更します。テキストエディタで既存のファイルを開きます:
sudo nano Dockerfile
2. CMDコマンドをENTRYPOINTに置き換えてコンテンツを編集します:
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello World"]
3.保存 および閉じる ファイル。
ENTRYPOINTを使用したDockerコンテナの実行
1.次のコマンドを使用して新しいイメージを作成します:
sudo docker build .
2.出力には、指定された名前で新しいイメージが正常にビルドされたことが示されます。次に、コマンドラインパラメータを追加せずにコンテナとして実行しましょう:
sudo docker run [container_name]
出力はCMDと同じになります。これは、実行コマンドに引数を追加していないためです。
3. ENTRYPOINTがどのように機能するかを確認するには、コンテナーの開始時にパラメーターを追加する必要があります。前の手順と同じコマンドを使用して、コンテナ名の後に何かを追加します。
sudo docker run [container_name] KnowledgeBase
ご覧のとおり、DockerはHelloWorldをエコーする最初の命令をオーバーライドしませんでした。既存のコマンドに新しいパラメータを追加しただけです。
ENTRYPOINTとCMDはどちらの形式でも使用できますが、通常はexecフォームに固執することをお勧めします。 。シェルフォームはプロセスで微妙な問題を引き起こすことがあるため、これはより信頼性の高いソリューションです。
CMDを使用したDockerエントリポイント
これまで見てきたように、ENTRYPOINTとCMDは似ていますが、同じではありません。さらに、これら2つの手順は相互に排他的ではありません。そうです、Dockerfileに両方を含めることができます。
CMDとENTRYPOINTを組み合わせることがDockerコンテナに最適なソリューションになる状況はたくさんあります。このような場合、実行可能ファイルはENTRYPOINTで定義されます 、CMDはデフォルトパラメータを指定します 。
両方の手順を使用している場合は、必ず実行形式で保持してください。 。
この例でENTRYPOINTとCMDがどのように連携するかを確認するために読んでください。
エントリポイントとCMDを使用してコンテナを実行する
1.まず、既存のDockerfileを変更して、両方の命令が含まれるようにします。次のコマンドでファイルを開きます:
sudo nano Dockerfile
2.ファイルには、実行可能ファイルを指定するENTRYPOINT命令と、実行コマンドに追加のパラメーターが追加されていない場合に表示されるデフォルトのパラメーターを定義するCMD命令が含まれている必要があります。
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]
3.次に、変更したDockerfileから新しいイメージを作成します。
sudo docker build .
4.パラメータなしで実行してコンテナをテストしましょう。次のコマンドを入力します:
sudo docker run [container_name]
Hello World
というメッセージが返されます 。ただし、docker runコマンドにパラメーターを追加するとどうなりますか?
5.同じコマンドをもう一度使用しますが、今回は実行コマンドに自分の名前を追加します。
sudo docker run [container_name] [your_name]
出力がHello [your_name]
に変更されました (私の場合は、 Hello Sofija
)。これは、ENTRYPOINT命令をオーバーライドできないのに対し、CMDを使用すると簡単にオーバーライドできるためです。