dockerfile における ENTRYPOINT と CMD の組み合わせと違い

dockerfile における ENTRYPOINT と CMD の組み合わせと違い

前回の記事【dockerコンテナのためのdockerfileを詳しく解説】では、dockerfileについてより詳しく解説しました。また、コンテナの起動コマンドは`ENTRYPOINT`と`CMD`の両方で指定できることも紹介しました。これら 2 つのコマンドは Dockerfile の記述を習得するための中核となるため、ここでは個別に説明します。

1. 前に書く

前回の記事では、dockerfile について包括的に理解しました。また、 ENTRYPOINTCMDでコンテナの起動コマンドを指定できることも説明しました。これら 2 つのコマンドは Dockerfile の記述を習得するための中核となるため、ここでは個別に説明します。

2. CMDとENTRYPOINTの主な違い

早速本題に入りましょう。CMD と ENTRYPOINT はどちらも、コンテナの実行を開始するコマンドを指定するために使用されます。違いは次のとおりです。

  • docker run コマンドに引数がある場合、デーモンは CMD コマンドを無視します。
  • ENTRYPOINT 命令の使用は無視されず、コマンド ラインに追加された docker run パラメータを受け取ります。

ビルドされたコンテナを正常に起動するには、作成する Dockerfile ファイルに CMD または ENTRYPOINT 命令が含まれている必要があります。

3. CMDとENTRYPOINTの組み合わせ

1.CMD

CMD命令には 3 つの形式があります。

  1. CMD ["executable","param1","param2"] ( exec形式、推奨形式)
  2. CMD ["param1","param2"] ( ENTRYPOINTのデフォルトパラメータとして)
  3. CMD command param1 param2 (シェル形式)

Dockerfile に複数の CMD が含まれている場合、最後の CMD のみが読み込まれて使用されます。

dockerhub で Centos の公式イメージを検索し、公式の dockerfile ファイルを確認します。

基本的に、各公式イメージは、次のように、独自のバージョンの Dockerfile リンクを提供します。

latestタグのDockerfileを見てみましょう。

ゼロから
centos-8-x86_64.tar.xz を追加します /
ラベル org.label-schema.schema-version="1.0" org.label-schema.name="CentOS ベースイメージ" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20201204"
コマンド ["/bin/bash"]

latestバージョンのcentos8.3.2011イメージをビルドするための Dockerfile の内容はたった 4 行です。ベースイメージを指定し (ここでは空のイメージから開始します)、rootfs コンテンツを追加し、ラベルを追加し、CMD を通じて起動コマンドを指定します。

Centos だけでなく、他の Debian、Ubuntu、busybox などのイメージでも、CMD を通じて起動コマンドを指定するだけで済みます。たとえば、busybox はより簡潔です。

ゼロから
busybox.tar.xz を追加 /
CMD ["sh"]

このような基本イメージとツールイメージを構築するには、コンテナを起動するために必要な CMD を指定するだけです。しかし、コンテナを起動するためだけに Dockerfile を書くわけではありません。ほとんどの場合、コンテナ内でアプリとサービスを実行したいのです。

もちろん、CMD 経由で起動することもできますが、これには欠陥があります。前述の CMD 起動コマンドは、docker run パラメータに置き換えられます。

以下のDockerfileがあります

[root@localhost dockerfiles]# cat Dockerfile 
Centosより
コマンド ["/bin/top","-b"]

ビルド後、パラメータ ps を使用してコンテナを起動します。

[root@localhost dockerfiles]# docker run -it centos_top:v1 ps
  PID TTY 時間 コマンド
    1 ポイント/0 00:00:00 ps

コンテナを起動した後、 top -bが ps に置き換えられ、パラメータの置き換えが実現されていないことがわかります。明らかにこれは私たちが望んでいることではありません。アプリケーションをデフォルトで起動し、それを docker 実行パラメータにロードする方法はありますか?これが ENTRYPOINT と CMD の魔法です。

2. ENTRYPOINTとCMDの組み合わせ

ENTRYPOINTの exec および shell 形式:

  • ENTRYPOINT ["executable", "param1", "param2"]
  • ENTRYPOINT command param1 param2

前述の通りCMD ["param1","param2"]形式が使用できます。同時に、ENTRYPOINTで指定したコマンドをdocker runパラメータで置き換えることはできません。 CMD と ENTRYPOINT の 2 つの命令を組み合わせると、CMD を介して docker 実行パラメータを受け取り、そのパラメータを ENTRYPOINT に渡して実行することができます。

公式のnginx dockerfile最新バージョン1.21を例に挙げます。

まず、 Dockerfileを見てみましょう。ここでは、次のように起動コマンドのみに焦点を当てます。

...
docker-entrypoint.sh をコピー /
コピー 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
20-envsubst-on-templates.sh /docker-entrypoint.d をコピーします
30-tune-worker-processes.sh /docker-entrypoint.d をコピーします
エントリポイント ["/docker-entrypoint.sh"]

エクスポーズ80

ストップシグナル SIGQUIT

CMD ["nginx", "-g", "デーモンオフ;"]

上記から、nginx コンテナを起動すると、最初にdocker-entrypoint.shスクリプトが実行され、CMD コマンドのパラメータnginx -g "daemon off;"渡されることがわかります。つまり、パラメータを追加せずに docker run を使用してコンテナを起動することは、デフォルトのパラメータを使用して次のスクリプトを実行することと同じです。

#docker-entrypoint.sh nginx -g "デーモンをオフ;"

docker run を使用してパラメータを渡すと何が起こりますか?

nginx-debugに合格しました

#docker run -dt nginx nginx-debug -g "デーモンをオフ;"

この時点で、コンテナを起動することは、次のスクリプトとパラメータを実行することと同等です。

#docker-entrypoint.sh nginx-debug -g "デーモンをオフ;"

psで起動したコンテナを見てみましょう

[root@localhost dockerfiles]# ps -ef|grep nginx
root 6327 6306 0 Aug12 pts/0 00:00:00 nginx: マスタープロセス nginx -g デーモンをオフ;
101 6384 6327 0 Aug12 pts/0 00:00:00 nginx: ワーカープロセス
101 6385 6327 0 Aug12 pts/0 00:00:00 nginx: ワーカープロセス
root 16800 16780 3 12:51 pts/0 00:00:00 nginx: マスタープロセス nginx-debug -g デーモンをオフ;
101 16857 16800 0 12:51 pts/0 00:00:00 nginx: ワーカープロセス
101 16858 16800 0 12:51 pts/0 00:00:00 nginx: ワーカープロセス

明らかに、パラメータ nginx と nginx-debug を持つ 2 つのコンテナが正常に起動されました。

つまり、 ENTRYPOINT ["/docker-entrypoint.sh"]を通じて指定したコマンドは起動時に必ず実行され、docker run のパラメータを受け取ることができます。

docker-entrypoint.sh とは何ですか? docker-entrypoint.sh これは通常、コマンドラインパラメータをフィルタリングしたり、exec を実行してコンテナ 1 のプロセスを開始したりするために使用される前処理スクリプトです。

コマンドのデフォルト パラメータを実装するか、ENTRYPOINT+CMD を介して docker run パラメータを受け取ることは、dockerfile を記述するための非常に一般的で便利な方法です。

dockerfile における ENTRYPOINT と CMD の組み合わせに関する記事はこれで終わりです。dockerfile における ENTRYPOINT と CMD の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • dockerfile における ENTRYPOINT と CMD の組み合わせと違い
  • Dockerfile における ENTRYPOINT と CMD の違い
  • カスタム Docker イメージを作成するための Dockerfile の詳細な説明と CMD と ENTRYPOINT 命令の比較
  • Dockerfile の CMD および ENTRYPOINT コマンドの詳細な説明

<<:  CSS のインライン スタイルに変換するソリューション (css-inline)

>>:  HTML img タグの alt 属性と title 属性の使い方の紹介

推薦する

Vue3 のレンダリング関数における互換性のない変更の詳細な説明

目次レンダリングAPIの変更レンダリング関数のパラメータレンダリング関数のシグネチャの変更VNode...

Linux で PHP curl 拡張機能をインストールする方法の詳細な説明

この記事では、Linux で PHP curl 拡張機能をインストールする方法について説明します。ご...

効果的なウェブフォームのための 8 つのルール

ユーザーから情報を収集する場合、Web フォームを使用するより簡単で直接的な方法はありません。適切に...

グローバルトーストコンポーネントをカプセル化するVueの完全な例

目次序文1. vue-cliを使う1. Toastコンポーネントを定義する2. main.jsで設定...

MacでNodeとnpmを完全にアンインストールする方法

npmアンインストール sudo npm アンインストール npm -g この文に遭遇して npm ...

vue3 学習ノートにおける axios の使用の変更の概要

目次1. axioの基本的な使い方2. クロスドメインの問題を解決するには? 3. パッケージ4. ...

MySQL ユーザー変数と set ステートメントの例の詳細な説明

目次1 ユーザー変数の概要2 ユーザー変数の定義3 ユーザー変数の使用3.1 セットを通した例3.2...

ウェブデザインで注意すべき検索最適化の知識

1. 新サイトホームページのリンクレイアウト1. リンク配置の位置:リンク配置の位置によって、リンク...

html2canvas を使用して、Baidu マップを含む Dom 要素を画像に処理するソリューション

問題 1: Baidu Map はタイル画像 (地図が写真で構成されている) を使用しています。ht...

Vue フィルターの使用とタイムスタンプ変換の問題

目次1. 概念をすぐに認識する: 2. ローカルフィルター: 3. グローバルフィルター: 4. 拡...

SQLでEXPLAINコマンドを使用する方法

日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...

js での遅延読み込みとプリロードの具体的な使用法

遅延読み込み(レイジー読み込み)とプリロードは、Web 最適化によく使用される手段です。 。 1. ...

Linux Crontab シェル スクリプトを使用して第 2 レベルのスケジュールされたタスクを実装する方法

1. シェルスクリプトcrontab.shを書く #!/bin/bash step=1 #ステップ間...

CSSは、マウスを線の上に置くと線全体の色を変える効果を実現します。

まとめ:以下のように、CSS で指定した行にマウスを置いたときに行全体の色を変更する方法を示します。...

Tomcat プロセスの CPU 使用率が高い場合のトラブルシューティング記録を記録する

この記事では主にTomcatプロセスを記録し、TCP接続が多すぎることによるCPU使用率の過剰のトラ...