起動時にDockerコンテナでコマンドを1つか2つ実行する必要がある場合は、このチュートリアルが最適です。 Dockerfile ENTRYPOINTの使用 およびCMD 手順に従って、必要な数の起動コマンドを実行できます。
このチュートリアルでは、ENTRYPOINTの使用方法を学習します およびCMD Dockerfileでスタートアップコマンドを実行し、それらの違いを理解するための手順。
このチュートリアルは実践的なデモンストレーションになるため、次のものを用意してください。
- このチュートリアルでは、Windows 10 PC – Windows10v10.0.19042を使用しました。
- Docker Desktop –このチュートリアルではDockerDesktopv3.3.1を使用します。
Dockerfileの作成
Dockerコンテナの起動コマンドを実行する前に、まずDockerfileを作成する必要があります。 Dockerfileは、コンテナー、Dockerイメージを構築し、Dockerイメージの作成方法を決定するコマンドのリストを含むテキストドキュメントです。
1.まず、PowerShellを管理者として開きます。
2. Dockerfileと、このチュートリアルで使用するすべての関連ファイルを保存するための新しいフォルダーを作成し、そのディレクトリに移動します。このチュートリアルでは、〜/ dockerを使用しています。 。
mkdir ~/docker
cd docker 3.次に、 Dockerfileという名前の空白のテキストファイルを作成します。 次のコマンドで。
cd > Dockerfile または、LinuxまたはMac OSを使用している場合は、次のコマンドを使用してDockerfileを作成できます。
touch Dockerfile 4.最後に、次のコンテンツを Dockerfileに追加します
FROM ubuntu:20.04 これで、間もなく作成されるDockerfileが作成されました!
Dockerイメージの構築
Dockerfileを作成したので、Dockerイメージを作成してDockerfileENTRYPOINTおよびCMD命令で記述されたコマンドを実行する必要があります。イメージをビルドする1つの方法は、buildを使用することです。 コマンド。
〜/ dockerにいる間 ディレクトリで、次のコマンドを実行します。以下のコマンドは、 demoというDockerイメージを作成します (-t demo )〜/ dockerのDockerfileから 現在の作業ディレクトリ(.)を指定します 。
docker build -t demo .
Dockerコンテナの実行
Dockerイメージをビルドしたら、DockerfileENTRYPOINTおよびCMD命令からのコマンドを実行するDockerイメージを実行するためのコンテナーが必要になります。
Dockerコンテナーを実行するには、runを呼び出します Dockerイメージ上に書き込み可能なコンテナーレイヤーを作成するコマンド(demo )。以下の例では、-itを使用しています。 サンプル出力を表示できるように、コンテナーにインタラクティブに接続するためのパラメーター。
docker run -it demo
Exec vs. Shell Form
Dockerfileの操作を開始し、スタートアップコマンドを実行する方法を理解すると、これらのコマンドを定義する2つの異なる方法に出くわす可能性があります。各メソッドはコマンドを呼び出しますが、呼び出し方は少し異なります。
Dockerがコマンドを実行する場合、execと直接呼ばれます。 または、コンテナのシェルを通過します(/bin/sh -c Linuxまたはcmd /S /C Windowsの場合)shellと呼ばれます 。
execを介して実行されるコマンドに気付くでしょう 以下に示すように、命令の後に実行可能ファイルを呼び出し、その後に1つ以上のコマンドライン引数を指定します。
ENTRYPOINT ["executables", "parameter1", "parameter2", ...]
CMD ["executables", "parameter1", "parameter2:, ...]
shellでコマンドを書く 一方、フォームでは、以下に示すように、コマンドを角かっこで囲む必要はありません。
ENTRYPOINT <command> "parameter1"
CMD <command> "parameter1"
CMDに引数を指定しない場合 、Dockerは常にコマンドをexec形式で実行します。CMD <command>。
始めたばかりの場合は、これら2つのコマンド呼び出しを区別することはそれほど重要ではありませんが、高度になるにつれて、それぞれの長所と短所がすぐにわかります。
ここで、このチュートリアルの要点を理解し、Dockerfile ENTRYPOINT内で起動コマンドを実行するいくつかの例を見ていきましょう。 およびCMD命令。
1.前に作成したDockerfileをお好みのテキストエディタで開きます。
2.以下に示すように、DockerfileのサンプルコンテンツをコピーしてDockerfileに貼り付け、保存します。
このDockerfileは、ubuntu:20.04を使用してレイヤーを作成します ベースイメージとして。次に、Dockerにechoを呼び出すように指示します。 Hello worldを渡すコマンド Dockerfile CMDの両方の引数 およびENTRYPOINT execを使用した命令 およびshell 形。
FROM ubuntu:20.04
# CMD Instruction
CMD ["echo", "Hello world"] # Exec Form
CMD echo "Hello world" # Shell Form
# ENTRYPOINT Instruction
ENTRYPOINT ["echo", "Hello world"] # Exec Form
ENTRYPOINT echo "Hello world" # Shell Form
3. 〜/ dockerにいる間 ディレクトリで、docker buildを実行して新しいイメージをビルドします それをdemoと呼びます 。 タグの下のコマンド demoとしての画像 現在の作業ディレクトリ(.)でDockerfileを探します )。
docker build -t demo .
4.ここで、イメージを使用してコンテナーを実行してから、前に作成したDockerイメージに基づいてDockerコンテナーを実行します。これで、コンテナがHello worldを返すことがわかります。 CMDから来ました Dockerfileで提供される命令。
docker run -it demo
Dockerfileでの変数の使用
コマンドに渡す正確なコマンドライン引数が事前にわからない場合があります。コマンドに渡す必要のある引数は、実行時にのみ公開されます。コマンド引数を静的に割り当てるのではなく、それらの引数をキャプチャして、変数を使用してコマンドに渡すことができます。
Dockerfile変数は
shellでのみ使用できます 形。 Dockerは、execを介して呼び出されるコマンドの変数をサポートしていません フォーム。
お好みのテキストエディタでDockerfileを再度開き、内部のすべてを次の一連のコマンドに置き換えて保存します。
今回は、Dockerfileが環境変数を使用し、ENVを使用して表示されていることに気付くでしょう。 。以下の例では、Dockerfileはnameという環境変数を定義しています。 friendの値を使用 。作成されると、この環境変数は$nameを介して参照されます。 。
DockerがこのDockerfileに基づいてコンテナーを実行すると、echoが呼び出されます。 コマンドを実行し、Welcome, friendの引数を渡します 。
FROM ubuntu:20.04
ENV name friend
CMD echo "Welcome, $name"
# or
## ENTRYPOINT echo "Welcome, $name"
ここで、Dockerイメージを作成し、コンテナーを再度実行して、オプションでshellformのタグ名を指定します。 。 Dockerがechoを呼び出したことに気付くでしょう コマンドを実行し、期待される出力を返しました。
DockerfileENTRYPOINTとCMD命令の組み合わせ
多くの場合、CMDまたはENTRYPOINT命令のいずれかで起動コマンドを呼び出します。結局のところ、各メソッドを使用して、必要な数のコマンドを呼び出すことができます。ただし、単一のコマンドを呼び出して、両方の命令を使用して「その上に構築」することもできます。
前の例に基づいて、おそらく次の例のようなDockerfileがあります。現状のまま、イメージを作成し、そのイメージからコンテナーを実行すると、Dockerはechoを呼び出します。 コマンドを実行してHelloを返します 。
FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]
echoに渡したい別の引数があるかもしれません コマンドがすぐにではありません。たぶん、Dockerfileのさらに下でそれを実行したいと思うでしょう。 CMDを呼び出す コマンドなしの命令、あなたはそうすることができます。
ENTRYPOINTを介して実行するコマンドを指定する場合 命令の後にCMDが続く 命令の場合、DockerはCMDに渡された値を自動的に想定します 引数です。コマンドではありません。
次に、CMDを追加します コマンドなしの命令リファレンス、worldと呼ばれる引数のみ 、以下に示すように。
FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]
CMD ["world"] 組み合わせ命令は、値をコンマで個別に指定するのではなく、すべてを1つの文字列で指定するという「配列のような」動作のため、常にexec形式で記述する必要があります。
イメージをビルドし、イメージからコンテナーを実行すると、2行の出力(Hello)の代わりにそれを確認できます。 およびworld )、Dockerは1つだけを返します。これは単一のechoのみを意味します。 コマンドの呼び出し。
これで、両方のCMDを介したDockerコンテナ起動コマンドの実行について十分に理解できたはずです。 およびENTRYPOINT Dockerfile命令。各命令は少し異なりますが、同じタスクを実行し、一緒に使用することもできます。
CMDを使用したいシナリオを考えてみてください ENTRYPOINT以上 起動コマンドを実行するには?