翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Docker キュー環境の概要
デフォルトのDockerキュー環境は、 EXPRおよび WRAP_ACTIONS OpenJD 拡張機能を宣言します。独自の入出力アクションは、ワーカーのルートレスDockerデーモンとセッションコンテナを管理します。キュー環境がアクティブな間、3 つのラップアクションが内部環境とタスクのアクションを置き換えます。
次のフローは、キュー環境がタスクアクションをラップする方法を示しています。
ポータブルジョブテンプレートは、
onRunコマンドとその引数を提供します。セッションランタイムは、 コマンドを直接実行する
onWrapTaskRunのではなく、元のonRunアクションを 内にラップします。フックは、
WrappedAction.Command、WrappedAction.Args、WrappedAction.Environmentを個別の引数として静的ラップスクリプトに渡します。ラップスクリプトは を使用して
docker container exec、ルートレスセッションコンテナ内で元のコマンドと引数を実行します。
ラッピング環境の onEnterアクションはセッションコンテナを開始し、その onExitアクションはコンテナを停止します。コンテナは、セッションディレクトリを同じパスにバインドマウントします。また、再利用可能なキャッシュ用に永続ストレージをバインドマウントすることもできます。
| キュー環境アクション | で実行 | 目的 |
|---|---|---|
onEnter | ワーカー | ルートレスデーモンを起動し、Amazon ECR に対して認証し、イメージをプルして、セッションコンテナを開始します。 |
onWrapEnvEnter | コンテナ | 内部環境の Enter アクションを実行します。 |
onWrapTaskRun | コンテナ | 各タスクのアプリケーションコマンドと引数を実行します。 |
onWrapEnvExit | コンテナ | 内部環境の終了アクションを実行します。 |
onExit | ワーカー | セッションコンテナ、ルートレスデーモン、およびユーザーマネージャーを停止します。 |
ラップ環境では、3 つのラップアクションをすべて定義する必要があります。各フックは、WrappedAction.Command、、WrappedAction.Argsおよび を通じて元のアクションを受け取りますWrappedAction.Environment。次の部分的なテンプレートは、デフォルトの環境がこれらの値を転送する方法を示しています。
specificationVersion: "environment-2023-09"
extensions:
- WRAP_ACTIONS
- EXPR
environment:
name: DockerContainer
script:
actions:
onWrapEnvEnter:
command: bash
args:
- "{{Env.File.Wrap}}"
- "{{ flatten([['-e', e] for e in WrappedAction.Environment]) }}"
- "--"
- "{{WrappedAction.Command}}"
- "{{WrappedAction.Args}}"
onWrapTaskRun:
command: bash
args:
- "{{Env.File.Wrap}}"
- "{{ flatten([['-e', e] for e in WrappedAction.Environment]) }}"
- "--"
- "{{WrappedAction.Command}}"
- "{{WrappedAction.Args}}"
onWrapEnvExit:
command: bash
args:
- "{{Env.File.Wrap}}"
- "{{ flatten([['-e', e] for e in WrappedAction.Environment]) }}"
- "--"
- "{{WrappedAction.Command}}"
- "{{WrappedAction.Args}}"ラップスクリプトは、引数ベクトルとして コマンドを受け取り、ルートレス内で権限のないjob-userアイデンティティDockerとして元のアクションを実行します。スクリプトは、既知の使用状況ベースのライセンス変数のみをホストから転送します。 AWS 認証情報はコンテナに転送されません。
デフォルトの環境では、セッション作業ディレクトリが同じパスにマウントされます。使用可能な場合は Container Device Interface (CDI) を介して GPUs を選択し、ラップされたアクションの終了ステータスを伝達します。データ共有の詳細については、「」を参照してくださいセッション作業ディレクトリを共有する。
Docker キュー環境をカスタマイズする
コンソールはデフォルトのDockerキュー環境を作成します。このテンプレートは、アプリケーション固有のマウント、環境変数、ネットワーク、イメージ選択、ランタイムオプションの開始点として使用できます。テンプレートをカスタマイズするときに、ルートレスデーモンのライフサイクル、セッションディレクトリマウント、3 つのラップフックをすべて保持します。
EXPR 拡張機能は、条件式をサポートしています。次の部分的な enter-script の例では、2 つのイメージから選択し、 UseGpuパラメータが true の場合にのみ GPU 引数を追加します。
IMAGE={{ repr_sh(Param.GpuImage if Param.UseGpu else Param.CpuImage) }}
GPU_ARGS=({{ repr_sh(['--gpus', 'all'] if Param.UseGpu else []) }})
docker container run \
--rm \
--detach \
"${GPU_ARGS[@]}" \
--mount {{ repr_sh("type=bind,src=" + Session.WorkingDirectory + ",dst=" + Session.WorkingDirectory) }} \
--workdir {{ repr_sh(Session.WorkingDirectory) }} \
"$IMAGE"
各フックでラッパースクリプトを条件付きで選択することもできます。次の部分アクションは、1 つのキュー環境パラメータからコンテナラッパーまたはホストラッパーを選択します。
onWrapTaskRun:
command: bash
args:
- "{{ Env.File.WrapContainer if Param.RunInContainer else Env.File.WrapHost }}"
- "{{ flatten([['-e', e] for e in WrappedAction.Environment]) }}"
- "--"
- "{{WrappedAction.Command}}"
- "{{WrappedAction.Args}}"
、onWrapEnvEnter、onWrapTaskRunおよび に同じランタイム条件を使用しますonWrapEnvExit。すべてのライフサイクルフェーズを同じランタイムに保持すると、内部環境が 1 つのコンテキストで入り、別のコンテキストで終了するのを防ぐことができます。WRAP_ACTIONS 拡張機能には、条件がホストラッパーを選択した場合でも、3 つのフックすべてが必要です。
ホストラッパーは を適用しWrappedAction.Environment、元の引数の境界を保持して、ラップされたアクションの終了ステータスを返す必要があります。コマンド値と引数値を引数ベクトルとして渡します。raw 値を の文字列に結合しないでくださいbash -c。引用ルールについては、「」を参照してくださいコマンドの構築とエスケープ。
OpenJD の仕様
GitHub ウェブサイトの OpenJD 式言語提案
GitHub ウェブサイトの OpenJD 式関数ライブラリ提案flattenと repr_*関数を定義します。
GitHub ウェブサイトの OpenJD 拡張パラメータタイプの提案
GitHub ウェブサイトの OpenJD 環境ラップアクション提案WrappedAction.*値を定義します。