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}" = '-' ]; の場合... これは 判定ステートメントは スクリプトに続くパラメータの最初の文字がハイフンの場合、後続のすべての文字列は mysqld 起動パラメータと見なされます。 上記の操作はPythonの文字列スライスに似ています --mysqld に "$@" を設定します 最初のパラメータが - で始まると判断された後、set -- mysqld "$@" コマンドが実行されます。set -- 構文が使用されます。set -- は、スペースで区切られたすべての文字列を $1、$2、$3 変数に順番に格納します。新しい $@ は、set -- の後の内容全体です。 例えば: この場合、 コマンド set --mysqld "$@" を実行した後:
docker-entrypoint.sh スクリプトを -x パラメータを追加して実行すると、$@ の値が変わることがわかります。元の $@ の値に基づいて、mysqld コマンドが先頭に事前追加されます。 実行 "$@" docker-entrypoint.sh スクリプトのほぼすべての最後の行で、exec "$@" コマンドが実行されます。 このコマンドの重要性は、イメージに対して予想される呼び出しシナリオを予測していることです。実際にイメージを使用するユーザーが、予期しない実行可能コマンドを実行すると、スクリプトの最後の行に移動して、ユーザーの新しい実行可能コマンドが実行されます。 状況評価 スクリプトの最後の行は、上記に直接言及されています。前のスクリプトでは、独自のスクリプトが呼び出される可能性がある状況を十分に考慮する必要があります。公式の MySQL dockerfile を例に挙げてみましょう。次の状況が決定されます。
${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リモートアクセスの設定方法をステップバイステップで説明します
TW のメインテキスト ページは、以前は小さなモニターと低解像度のユーザーを考慮して幅が 850 ピ...
Cocos Creator バージョン: 2.3.4デモのダウンロード: https://files...
適切なデータベース仕様は、ソフトウェア実装の複雑さを軽減し、通信コストを削減するのに役立ちます。この...
目次序文:システム要件:インストール環境:古いバージョンをアンインストールします: yum は具体的...
Enctype : ブラウザがデータをサーバーに送り返すときに使用するエンコーディングのタイプを指定...
注: システムは Ubuntu 14.04LTS、32 ビット オペレーティング システムです。Py...
最近、イントラネットポータルを修正していたときに、フィルターを使用する必要がある箇所に遭遇しました。...
ConcurrentHashMapを学習しましたが、どのように適用すればよいかわかりませんか? To...
序文HTTP はステートレスな通信プロトコルです。各リクエストは互いに独立しており、サーバーは以前の...
チャットボットは多くの手作業を省くことができ、顧客サービス、天気予報対応など、さまざまな状況で使用で...
ブロック引用の定義と使用法<blockquote> タグは引用ブロックを定義します。 &...
HTML ドキュメント内の要素は次々に配置され、ブロックレベル要素の前後に改行が追加されるだけで、合...
フレーム ウィンドウの関連付けを実現するには、次に示すように、ハイパーリンクの「ターゲット」ウィンド...
目次1. データベースとは何ですか? 2. データベースの分類は? 3. データベースとデータ構造の...
ウェブフロントエンド1学生証名前性別年01張三男20 02李思女性21総人数60フォームのコンポーネ...