docker エントリポイントファイルの詳細な説明

docker エントリポイントファイルの詳細な説明

Dockerfile を作成するときは、コンテナが起動する前に初期化構成やカスタム構成を実行するために使用されるエントリポイント構成を含めます。通常はスクリプトであり、関連する定義済み項目がスクリプト内で構成されます。このドキュメントでは、エントリポイント ファイルの記述スキルについて詳しく説明します。

以下は、MySQL 公式イメージのエントリポイント ファイル docker-entrypoint.sh を例にしています。ファイル アドレスは次のとおりです。

docker-entrypoint.sh

セット-e

作成するすべてのスクリプトは、set -e で始まる必要があります。これは、いずれかのステートメントが true 以外の値に評価された場合に bash を終了するように指示します。これにより、エラーが雪だるま式に大きくなり、以前に処理されるべき致命的なエラーになるのを防ぐことができます。読みやすさを向上させるには、set -e と同じことを行う set -o errexit を使用します。

-o パイプフェイルを設定する

設計目的は上記と同じです。つまり、実行エラーが発生したらすぐに終了し、それ以上実行しないようにします。 -o pipefail のスコープはパイプラインです。つまり、Linux スクリプトでは、前のコマンドの実行に失敗した場合は、すぐに終了する必要があります。

shopt -s ヌルグロブ

Linux で * ? などのワイルドカードを使用する場合、一致するファイルがない場合、「そのようなファイルまたはディレクトリはありません」というメッセージは表示されず、コマンドの後のパラメータが削除されて実行されます。

[ "${1:0:1}" = '-' ]; の場合...

これはif command starts with an option, prepend mysqld mysqldを先頭に追加します。

判定ステートメントは${1:0:1} $1 (スクリプト呼び出しの最初のパラメータ)、オフセット0(オフセットなし)、文字の取得(文字列の長さの取得)を判定することを意味します。

スクリプトに続くパラメータの最初の文字がハイフンの場合、後続のすべての文字列は mysqld 起動パラメータと見なされます。

上記の操作はPythonの文字列スライスに似ています

--mysqld に "$@" を設定します

最初のパラメータが - で始まると判断された後、set -- mysqld "$@" コマンドが実行されます。set -- 構文が使用されます。set -- は、スペースで区切られたすべての文字列を $1、$2、$3 変数に順番に格納します。新しい $@ は、set -- の後の内容全体です。

例えば: bash docker-entrypoint.sh -f xxx.conf

この場合、 set -- mysqld "$@"の$@の値は-f xxx.conf

コマンド set --mysqld "$@" を実行した後:

  • $1 = mysqld
  • $2=-f
  • $3=xxx.conf
  • $@=mysqld -f xxx.conf

docker-entrypoint.sh スクリプトを -x パラメータを追加して実行すると、$@ の値が変わることがわかります。元の $@ の値に基づいて、mysqld コマンドが先頭に事前追加されます。

実行 "$@"

docker-entrypoint.sh スクリプトのほぼすべての最後の行で、exec "$@" コマンドが実行されます。

このコマンドの重要性は、イメージに対して予想される呼び出しシナリオを予測していることです。実際にイメージを使用するユーザーが、予期しない実行可能コマンドを実行すると、スクリプトの最後の行に移動して、ユーザーの新しい実行可能コマンドが実行されます。

状況評価

スクリプトの最後の行は、上記に直接言及されています。前のスクリプトでは、独自のスクリプトが呼び出される可能性がある状況を十分に考慮する必要があります。公式の MySQL dockerfile を例に挙げてみましょう。次の状況が決定されます。

  • -で始まる場合はパラメータとして扱われます
  • 名前はmysqldで始まり、ユーザーIDは0(ルートユーザー)です。
  • mysqldが先頭にある場合
  • アプリケーションのすべての呼び出し形式を決定したら、最後にexec "$@"コマンドを追加する必要があります。

${mysql[@]}

シェル内の配列、${mysql[@]}を直接実行すると、この配列は実行可能プログラムとして実行されます。

mysql=(mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" )
${mysql[1]}をエコーする
-- 出力: mysql
エコー${mysql[2]}
--出力: --プロトコル=ソケット
エコー${mysql[3]}
--出力: -uroot
エコー${mysql[4]}
--出力: -hlocalhost
${mysql[@]}をエコーする
--output:mysql --protocol=socket -uroot -hlocalhost --socket=

gosu mysql を実行 "$BASH_SOURCE" "$@"

ここでのgosuコマンドは、Linuxのsudoコマンドの軽量な「代替」です。

gosu は、シェルの sudo コマンドを置き換えるために使用される、golang 言語で開発されたツールです。su コマンドと sudo コマンドにはいくつかの欠陥があり、主に TTY が不確実で、シグナル転送に問題があります。特定のユーザーでプログラムを実行したいだけの場合、su または sudo を使用すると重すぎるため、gosu が生まれました。

gosu は、コンテナ内でアプリケーションを起動するために libcontainer の原理を直接借用し、/etc/passwd を使用してアプリケーションを処理します。gosu は最初に指定されたユーザーまたはユーザー グループを見つけ、次にそのユーザーまたはユーザー グループに切り替えます。次に、exec を使用してアプリケーションを起動します。ここまでで、gosu は作業を完了しており、アプリケーションの後続の宣言サイクルには参加しません。この方法は、gosu が TTY を処理してセマフォを転送するという問題を回避し、これら 2 つのタスクをアプリケーションに直接渡して完了させます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  MySQLリモートアクセスの設定方法をステップバイステップで説明します

>>:  MySQL での挿入効率のいくつかの例の比較

推薦する

Vue3 の組み合わせ API における setup、ref、reactive の完全な使用方法

1. セットアップを始める次のコード関数を簡単に紹介します。 ref 関数を使用して変数の変更を監視...

MySQLスレーブライブラリの復元の実践記録

状況の説明:今日、MySQL データベースのスレーブ ノード ホストにログインしたところ、/var/...

MySQL インデックスの効率的な使用ガイド

序文ほとんどの方がMySQLとインデックスを使用したことがあると思いますが、適切なインデックスを作成...

ファイアウォールの iptables 戦略を使用して Linux サーバー上のポートを転送する方法

2つの異なるサーバー間の転送ポート転送を有効にするまず、デフォルトでは無効になっている IP 転送機...

MySql5.7.18 の文字セット構成の詳細なグラフィック説明

背景:かなり前(2017.6.5、記事にはタイムリーさがあり、特に使用されているツールは頻繁に更新さ...

Reactにおけるコンポーネント通信の詳細な説明

目次親コンポーネントは子コンポーネントと通信します子コンポーネントは親コンポーネントと通信しますコン...

VUEはFlappy Birdゲームのサンプルコードを実装します

Flappy Bird は、誰もがアプリでプレイしたことがある非常にシンプルな小さなゲームです。ここ...

Nginx を使用して https ルートドメイン名への 301 リダイレクトを実装するためのサンプル コード

SEO とセキュリティを考慮して、301 リダイレクトが必要です。以下の一般的な処理には Nginx...

画像をMySQLデータベースに保存し、フロントエンドページに表示するための実装コード

目次1. まず、pycharmを使用してDjangoプロジェクトを作成し、関連する環境を設定します。...

HTML でフォームを中央揃えにする

以前、写真が与えられ、その写真スタイルに基づいてフォームを作成するという課題に遭遇しました。しかし、...

MySQL 8.0 でリモートアクセス権限を設定する方法

前回の記事では、MySQL パスワードをリセットする方法を説明しました。一部の学生から、データベース...

And キーワードを使用した MySQL の複数条件クエリ ステートメント

AND キーワードを使用した MySQL 複数条件クエリ。MySQL では、AND キーワードを使用...

【HTML要素】タグテキストの詳細説明

1. 基本的なテキスト要素を使用してコンテンツをマークアップするまず表示効果を見てみましょう:対応す...

検証コード干渉を実装する js (動的)

この記事の例では、検証コードの動的干渉を実装するためのjsの具体的なコードを共有しています。具体的な...

Ubuntu 20.04 オペレーティング システムの VMware インストール チュートリアル図

メモ: とにかく体験してみましょう。記録: NO.209この例の環境:仮想マシン: vmwareオペ...