起動時に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
以上 起動コマンドを実行するには?