View a markdown version of this page

Docker キュー環境の概要 - Deadline クラウド

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Docker キュー環境の概要

デフォルトのDockerキュー環境は、 EXPRおよび WRAP_ACTIONS OpenJD 拡張機能を宣言します。独自の入出力アクションは、ワーカーのルートレスDockerデーモンとセッションコンテナを管理します。キュー環境がアクティブな間、3 つのラップアクションが内部環境とタスクのアクションを置き換えます。

次のフローは、キュー環境がタスクアクションをラップする方法を示しています。

  1. ポータブルジョブテンプレートは、 onRun コマンドとその引数を提供します。

  2. セッションランタイムは、 コマンドを直接実行するonWrapTaskRunのではなく、元のonRunアクションを 内にラップします。

  3. フックは、WrappedAction.Command、WrappedAction.Args、 WrappedAction.Environmentを個別の引数として静的ラップスクリプトに渡します。

  4. ラップスクリプトは を使用してdocker container exec、ルートレスセッションコンテナ内で元のコマンドと引数を実行します。

ラッピング環境の onEnterアクションはセッションコンテナを開始し、その onExitアクションはコンテナを停止します。コンテナは、セッションディレクトリを同じパスにバインドマウントします。また、再利用可能なキャッシュ用に永続ストレージをバインドマウントすることもできます。

ポータブルジョブテンプレートは、元の onRun アクションを onWrapTaskRun 境界に渡します。アクションは WrappedAction 値として静的ラップスクリプトに渡され、ルートレスセッションコンテナ内で実行されます。キュー環境は、セッションディレクトリとオプションの永続ストレージをマウントするコンテナを起動および停止します。
キュー環境アクションで実行目的
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 環境ラップアクション提案では、3 つのラップフックとWrappedAction.*値を定義します。