日本語

開発者ツール · Docker run から Docker compose コンバーター

引用符、改行、$VARS: docker run コマンドを正しく解析する

· 仕組み

ドッカー コマンドライン 引用

引用符、改行、$vars を示す抽象図: docker run コマンドを正しく解析する
オリジナル ToolAcre ベクトル イラスト

docker run コマンドは、Docker がそれを認識する前にシェル入力になります。この投稿では、引用符と行継続によってトークンの内容がどのように変わるか、およびコンバーターがシェル変数を拡張できない理由について説明します。

コンバーターはリテラル $HOME を受け取りました — docker が実行される前にシェルが展開するため、コマンドはターミナルで機能します

コンバーターはリテラル $HOME を受け取りました。シェルが Docker の実行前に展開するため、コマンドはターミナルで機能します。証拠: トークナイザーは展開を実行しないため、$HOME はテキストのままです。使い捨てリテラルを使用してシェルのトークン化を再現します。各ソースの出現箇所を引用符で囲まれたトークンと継続と組み合わせます。宛先レビューのための予約拡張と Windows 解析。

引用インシデントは、別の引用インシデントの境界として、一重引用符がリテラルであり、二重引用符が文書化されたエスケープを処理することも明らかにしています。証拠: 一重引用符はリテラルであり、二重引用符は文書化されたエスケープを処理します。このシェルのトークン化制約は停止点です。製造動作を行わずに引用符で囲まれたトークンと継続を検査し、展開と Windows 解析のホスト チェックを文書化します。

このトークナイザーは、選択された POSIX シェル ワード ルールに似ていますが、変数やコマンドの展開は実行しません。

シェルが最初、Docker が 2 番目 — Docker が受け取るトークンは、シェルの引用、分割、展開の結果です。証拠: 選択された POSIX 風の単語ルールは、シェルになることなく実装されます。このトークナイザーは、選択された POSIX シェル ワード ルールに似ていますが、変数やコマンドの展開は実行しません。シェルのトークン化トークンを引用符で囲まれたトークンと継続にトレースします。順序付けされた値を最終値フィールドから分離します。展開と Windows 解析はコレクションの外にあります。

関連する引用メカニズムの境界は、この引用セクションについては、この引用セクションのコマンドとこの引用セクションの警告のオリジナルをこの候補ファイルの横に保持することです。証拠: リポジトリは、より広範な実行時または歴史的な証拠を提供しません。このシェルのトークン化ファクトを使用して、引用符で囲まれたトークンおよび継続内の 1 つのメンバーまたはスカラーを予測します。拡張と Windows 解析について決定する前に、警告を確認してください。

バックスラッシュと改行の継続 — 末尾のバックスラッシュがシェルの機能であり、コマンドを区切った後の空白スペースである理由

バックスラッシュと改行の継続 — 末尾のバックスラッシュがシェルの機能であり、コマンドを中断した後の空白スペースである理由。証拠: 端末の単独のバックスラッシュが失敗すると、バックスラッシュと改行が表示されなくなります。シェルのトークン化シリアル化をそのモデルから判断します。引用符で囲まれたトークンと継続で引用すると型は保護されますが、展開や Windows 解析の動作証明は得られません。

2 番目の引用シリアル化の観察は、別個の引用出力境界は、Wiki サンプルを正規化し、そのリテラル トークンを検査できることです。証拠: Wiki サンプルは正規化でき、そのリテラル トークンを検査できます。このシェルのトークン化出力は、設定を使用できないコンテキストから分離します。引用符で囲まれたトークンと継続をレビュー可能な状態に保ち、展開と Windows 解析を個別にチェックします。

値内の単一引用符、二重引用符、スペース — -e MSG='hello world' と -e MSG=hello world

値内の単一引用符、二重引用符、スペース — -e MSG='hello world' と -e MSG=hello world。推測するのではなく、シェルのトークン化例外で停止してください。引用符で囲まれたトークンや継続に近い追加には、展開と Windows 解析に関連した展開固有の理由が必要です。

もう 1 つの引用例外制約は、Docker オプションのアリティがトークン化に従い、Windows ルールが存在しないことです。証拠: Docker オプションのアリティはトークン化に従い、Windows ルールは存在しません。元のシェルのトークン化コマンドは警告の横に残しておきます。この比較により、引用符で囲まれたトークンと継続に何が含まれているか、またどの展開と Windows 解析の決定が手動のままであるかが示されます。

コンバータはシェルではないため、ドル式、サブシェル構文、チルダはリテラルのままです。

変数とサブシェル — $PWD、$(id -u)、および ~ はシェルによって展開されるため、コンバーターはそれらを文字通りに認識します。証拠: サブシェル表記のバッククォートドル変数とチルダは決して評価されません。コンバータはシェルではないため、ドル式、サブシェル構文、チルダはリテラルのままです。合成名からシェルのトークン化の例を構築します。運用拡張や Windows 解析の詳細を公開することなく、引用符で囲まれたすべてのトークンと継続項目を追跡可能にします。

同じ引用例のサンプルは、この引用セクションについて、この引用セクションのコマンドとこの候補ファイルの横にあるこの引用セクションの警告のオリジナルを保持することを示しています。ペアになったシェルのトークン化ファクトは、引用符で囲まれたトークンと継続に表示される必要があります。その行を記録し、展開や Windows の解析に関する思い込みを避けてください。

うまくいった例: wiki に貼り付けられたコマンドをクリーンアップする — 変換前に継続と引用を正規化し、YAML をチェックする

うまくいった例: Wiki に貼り付けられたコマンドをクリーンアップします。変換前に継続と引用を正規化し、YAML をチェックします。シェルのトークン化の結果を、観察可能な 1 つの引用符で囲まれたトークンと継続の違いに変換します。 Docker は、後の拡張と Windows 解析の判定を所有します。

引用結果の実装では、トークナイザーが展開を実行しないため、$HOME がテキストのままであるという別の引用効果の境界も示されています。スプリットシェルのトークン化の責任: 変換は引用符で囲まれたトークンと継続を書き込み、リポジトリはシークレットを削除し、オペレーターは展開と Windows 解析を検証します。

Windows シェルの引用と完全な POSIX 展開は両方ともこのパーサーの外にあります

これでカバーされないもの — = とスペースなどの docker run 独自のオプション解析の癖、および Windows シェルの引用符の違い。証拠: Docker オプションのアリティはトークン化に従い、Windows ルールは存在しません。 Windows シェルの引用と完全な POSIX 展開は両方ともこのパーサーの外部にあります。シェルのトークン化の範囲を、ここに示す引用符で囲まれたトークンと継続ブランチに制限します。隣接するフォームとデフォルトは、拡張や Windows 解析の質問に答えることができません。

この引用セクションの元のコマンドとこの候補ファイルの横にある警告を保持することにより、引用範囲制限が 1 つ追加されます。このシェルのトークン化境界を除外として扱います。展開や Windows 解析に関する推測よりも、正確な引用符と継続を優先します。

要点: Docker が認識する内容をコンバーターに提供し、シェル変数をリテラル値または Compose ${VAR} 補間で置き換えます。

要点: Docker が認識する内容をコンバーターに提供し、シェル変数をリテラル値または Compose ${VAR} 補間で置き換えます。証拠: 信頼できる入力とは、解析を目的とした文字通りの単語を入力することを意味します。ソース オプション、モデル フィールド、引用符で囲まれたトークン、継続行、および警告としてシェルのトークン化を監査します。展開と Windows 解析をチェックする前にシークレットを削除してください。

最後に、引用の取り出しソースは、別の引用の決定境界は、終端の単独のバックスラッシュが失敗する間にバックスラッシュと改行が消えることであることを確認します。シェルのトークン化を狭く閉じます。引用符で囲まれたトークンと継続が候補です。拡張、Windows の解析、およびシェルの等価性は保証されません。