

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

# Docker キュー環境の概要
<a name="containers-queue-environment"></a>

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

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

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

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

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

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

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

![ポータブルジョブテンプレートは、元の onRun アクションを onWrapTaskRun 境界に渡します。アクションは WrappedAction 値として静的ラップスクリプトに渡され、ルートレスセッションコンテナ内で実行されます。キュー環境は、セッションディレクトリとオプションの永続ストレージをマウントするコンテナを起動および停止します。](https://docs.aws.amazon.com/ja_jp/deadline-cloud/latest/developerguide/images/wrap-actions-flow.png)



| キュー環境アクション | で実行 | 目的 | 
| --- | --- | --- | 
| 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 を選択し、ラップされたアクションの終了ステータスを伝達します。データ共有の詳細については、「」を参照してください[セッション作業ディレクトリを共有する](containers-share-session-directory.md)。

## Docker キュー環境をカスタマイズする
<a name="containers-queue-customize"></a>

コンソールはデフォルトの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`。引用ルールについては、「」を参照してください[コマンドの構築とエスケープ](containers-security.md#containers-security-command-construction)。

## OpenJD の仕様
<a name="containers-openjd-references"></a>

GitHub ウェブサイトの [OpenJD 式言語提案](https://github.com/OpenJobDescription/openjd-specifications/blob/mainline/rfcs/0005-expression-language.md)では、式の評価、型付きパス、セッションシンボルを定義します。

GitHub ウェブサイトの [OpenJD 式関数ライブラリ提案](https://github.com/OpenJobDescription/openjd-specifications/blob/mainline/rfcs/0006-expression-function-library.md)では、 関数`flatten`と `repr_*`関数を定義します。

GitHub ウェブサイトの [OpenJD 拡張パラメータタイプの提案](https://github.com/OpenJobDescription/openjd-specifications/blob/mainline/rfcs/0007-extend-parameter-types.md)では、ポータブルテンプレートで使用できるリスト値パラメータを定義します。

GitHub ウェブサイトの [OpenJD 環境ラップアクション提案](https://github.com/OpenJobDescription/openjd-specifications/blob/mainline/rfcs/0008-environment-wrap-actions.md)では、3 つのラップフックと`WrappedAction.*`値を定義します。