

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Docker 대기열 환경 개요
<a name="containers-queue-environment"></a>

기본 Docker 대기열 환경은 `EXPR` 및 `WRAP_ACTIONS` OpenJD 확장을 선언합니다. 자체 입력 및 종료 작업은 작업자의 루트 없는 Docker 데몬 및 세션 컨테이너를 관리합니다. 대기열 환경이 활성화되어 있는 동안 세 가지 래핑 작업이 내부 환경 및 작업의 작업을 대체합니다.

다음 흐름은 대기열 환경이 작업 작업을 래핑하는 방법을 보여줍니다.

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/ko_kr/deadline-cloud/latest/developerguide/images/wrap-actions-flow.png)



| 대기열 환경 작업 | 에서 실행 | 용도 | 
| --- | --- | --- | 
| onEnter | 작업자 | 루트 없는 데몬을 시작하고, Amazon ECR에 인증하고, 이미지를 가져오고, 세션 컨테이너를 시작합니다. | 
| onWrapEnvEnter | 컨테이너 | 내부 환경의 Enter 작업을 실행합니다. | 
| onWrapTaskRun | 컨테이너 | 각 작업의 애플리케이션 명령 및 인수를 실행합니다. | 
| onWrapEnvExit | 컨테이너 | 내부 환경의 종료 작업을 실행합니다. | 
| onExit | 작업자 | 세션 컨테이너, 루트 없는 데몬 및 사용자 관리자를 중지합니다. | 

래핑 환경은 세 가지 래핑 작업을 모두 정의해야 합니다. 각 후크는 `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 자격 증명을 전달하지 않습니다.

기본 환경은 세션 작업 디렉터리를 동일한 경로에 탑재합니다. 사용 가능한 경우 컨테이너 디바이스 인터페이스(CDI)를 통해 GPUs를 선택하고 래핑된 작업의 종료 상태를 전파합니다. 데이터 공유 세부 정보는 섹션을 참조하세요[세션 작업 디렉터리 공유](containers-share-session-directory.md).

## Docker 대기열 환경 사용자 지정
<a name="containers-queue-customize"></a>

콘솔은 기본 Docker 대기열 환경을 생성합니다. 이 템플릿을 애플리케이션별 탑재, 환경 변수, 네트워킹, 이미지 선택 및 런타임 옵션의 시작점으로 사용할 수 있습니다. 템플릿을 사용자 지정할 때 루트 없는 데몬 수명 주기, 세션 디렉터리 마운트 및 세 개의 래핑 후크를 모두 보존합니다.

`EXPR` 확장은 조건 표현식을 지원합니다. 다음 부분 Enter-script 예제에서는 두 이미지 중에서 선택하고 `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"
```

각 후크에서 조건부로 래퍼 스크립트를 선택할 수도 있습니다. 다음 부분 작업은 하나의 대기열 환경 파라미터에서 컨테이너 래퍼 또는 호스트 래퍼를 선택합니다.

```
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`. 모든 수명 주기 단계를 동일한 런타임에 유지하면 내부 환경이 한 컨텍스트로 들어오고 다른 컨텍스트로 나가는 것을 방지할 수 있습니다. 조건이 호스트 래퍼를 선택하는 경우에도 `WRAP_ACTIONS` 확장에는 세 개의 후크가 모두 필요합니다.

호스트 래퍼는를 적용하고`WrappedAction.Environment`, 원래 인수 경계를 보존하고, 래핑된 작업의 종료 상태를 반환해야 합니다. 명령 및 인수 값을 인수 벡터로 전달합니다. 원시 값을의 문자열로 결합하지 마십시오`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)은 세 개의 래핑 후크와 `WrappedAction.*` 값을 정의합니다.