{"meta":{"title":"작업에서 사용하는 컨테이너 사용자 지정","intro":"자체 호스트형 실행기가 작업에 대한 컨테이너를 호출하는 방법을 사용자 지정할 수 있습니다.","product":"GitHub Actions","breadcrumbs":[{"href":"/ko/enterprise-cloud@latest/actions","title":"GitHub Actions"},{"href":"/ko/enterprise-cloud@latest/actions/how-tos","title":"사용법"},{"href":"/ko/enterprise-cloud@latest/actions/how-tos/manage-runners","title":"실행기 관리"},{"href":"/ko/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners","title":"자체 호스팅 실행기"},{"href":"/ko/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers","title":"컨테이너 사용자 지정"}],"documentType":"article"},"body":"# 작업에서 사용하는 컨테이너 사용자 지정\n\n자체 호스트형 실행기가 작업에 대한 컨테이너를 호출하는 방법을 사용자 지정할 수 있습니다.\n\n> \\[!NOTE]\n> 이 기능은 현재 공개 미리 보기 상태에 있으며, 향후 변경될 수 있습니다.\n\n## 컨테이너 커스터마이징에 대하여\n\nGitHub Actions 를 사용하면 워크플로 파일의 문을 사용하여 `container:` 컨테이너 내에서 작업을 실행할 수 있습니다. 자세한 내용은 [컨테이너에서 작업 실행](/ko/enterprise-cloud@latest/actions/how-tos/write-workflows/choose-where-workflows-run/run-jobs-in-a-container)을(를) 참조하세요. 컨테이너 기반 작업을 처리하기 위해 자체 호스트형 실행기는 각 작업에 대한 컨테이너를 만듭니다.\n\nGitHub Actions 는 자체 호스팅 실행기에서 컨테이너를 만드는 방법을 사용자 지정할 수 있는 명령을 지원합니다. 예를 들어 이러한 명령을 사용하여 Kubernetes 또는 Podman을 통해 컨테이너를 관리하고 컨테이너를 호출하는 데 사용되는 `docker run` 또는 `docker create` 명령을 사용자 지정할 수도 있습니다. 사용자 지정 명령은 실행기에서 특정 환경 변수를 설정할 때 자동으로 트리거되는 스크립트에 의해 실행됩니다. 자세한 내용은 아래의 [사용자 지정 스크립트 트리거](#triggering-the-customization-script)를 참조하세요.\n\n이 사용자 지정은 Linux 기반 자체 호스트형 실행기에서만 사용할 수 있으며 루트 사용자 액세스는 필요하지 않습니다.\n\n## 컨테이너 사용자 지정 명령\n\nGitHub Actions 에는 컨테이너 사용자 지정을 위한 다음 명령이 포함되어 있습니다.\n\n* [\n  `prepare_job`\n  ](/ko/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#prepare_job): 작업이 시작될 때 호출됩니다.\n* [\n  `cleanup_job`\n  ](/ko/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#cleanup_job): 작업이 종료될 때 호출됩니다.\n* [\n  `run_container_step`\n  ](/ko/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#run_container_step): 작업의 각 컨테이너 작업에 대해 한 번씩 호출됩니다.\n* [\n  `run_script_step`\n  ](/ko/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#run_script_step): 컨테이너 작업이 아닌 모든 단계를 실행합니다.\n\n이러한 사용자 지정 명령은 각각 자체 JSON 파일에 정의되어야 합니다. 파일 이름은 확장명이 `.json`인 명령 이름과 일치해야 합니다. 예를 들어 `prepare_job` 명령은 `prepare_job.json`에 정의되어 있습니다. 그런 다음 이러한 JSON 파일은 자체 호스트형 실행기에서 주 `index.js` 스크립트의 일부로 함께 실행됩니다. 이 프로세스는 [사용자 지정 스크립트 생성](#generating-the-customization-script)에서 자세히 설명합니다.\n\n이러한 명령에는 아래에 자세히 설명된 구성 인수도 포함됩니다.\n\n### `prepare_job`\n\n작업이 시작될 때 `prepare_job` 명령이 호출됩니다.\nGitHub Actions는 해당 작업에 있는 모든 작업 또는 서비스 컨테이너를 전달합니다. 이 명령은 작업에 서비스 컨테이너 또는 작업 컨테이너가 있는 경우 호출됩니다.\n\nGitHub Actions\n`prepare_job` 명령에서 다음 작업을 수행할 것으로 가정합니다:\n\n* 필요한 경우 이전 작업에서 항목을 정리합니다.\n* 필요한 경우 네트워크를 만듭니다.\n* 작업 및 서비스 컨테이너를 끌어옵니다.\n* 작업 컨테이너를 시작합니다.\n* 서비스 컨테이너를 시작합니다.\n* 필요한 모든 정보를 GitHub Actions 응답 파일에 씁니다.\n  * 필수 사항: 컨테이너가 `alpine` Linux 컨테이너인지 여부를 나타냅니다(`isAlpine` 부울 사용).\n  * 선택 사항: 작업 컨텍스트에서 설정하려는 모든 컨텍스트 필드. 설정하지 않으면 사용자가 필드를 사용할 수 없습니다. 자세한 내용은 [문맥 참조](/ko/enterprise-cloud@latest/actions/reference/workflows-and-actions/contexts#job-context)을(를) 참조하세요.\n* 상태 검사가 성공하고 작업/서비스 컨테이너가 시작되면 `0`을 반환합니다.\n\n#### `prepare_job`의 인수\n\n* `jobContainer`: **선택 사항**. 지정된 작업 컨테이너에 대한 정보를 포함하는 개체입니다.\n  * `image`: **필수 사항**. Docker 이미지를 포함하는 문자열입니다.\n  * `workingDirectory`: **필수 사항**. 작업 디렉터리의 절대 경로를 포함하는 문자열입니다.\n  * `createOptions`: **선택 사항**. YAML에 지정된 선택적 *생성* 옵션입니다. 자세한 내용은 [컨테이너에서 작업 실행](/ko/enterprise-cloud@latest/actions/how-tos/write-workflows/choose-where-workflows-run/run-jobs-in-a-container#example-running-a-job-within-a-container)을(를) 참조하세요.\n  * `environmentVariables`: **선택 사항**. 주요 환경 변수의 맵을 설정합니다.\n  * `userMountVolumes`: **선택 사항**. YAML에 설정된 사용자 탑재 볼륨의 배열입니다. 자세한 내용은 [컨테이너에서 작업 실행](/ko/enterprise-cloud@latest/actions/how-tos/write-workflows/choose-where-workflows-run/run-jobs-in-a-container#example-running-a-job-within-a-container)을(를) 참조하세요.\n    * `sourceVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.\n    * `targetVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.\n    * `readOnly`: **필수 사항**. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.\n  * `systemMountVolumes`: **필수 사항**. 컨테이너에 설치할 마운트 배열입니다. 필드는 위와 동일합니다.\n    * `sourceVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.\n    * `targetVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.\n    * `readOnly`: **필수 사항**. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.\n  * `registry`\n    **선택 사항**. 프라이빗 컨테이너 레지스트리에 대한 Docker 레지스트리 자격 증명입니다.\n    * `username`: **선택 사항**. 레지스트리 계정의 사용자 이름입니다.\n    * `password`: **선택 사항**. 레지스트리 계정의 암호입니다.\n    * `serverUrl`: **선택 사항**. 레지스트리 URL입니다.\n  * `portMappings`: **선택 사항**. 컨테이너에 매핑할 *source:target* 포트의 키 값 해시입니다.\n* `services`: **선택 사항**. 스핀업할 서비스 컨테이너의 배열입니다.\n  * `contextName`: **필수 사항**. 작업 컨텍스트에 있는 서비스의 이름입니다.\n  * `image`: **필수 사항**. Docker 이미지를 포함하는 문자열입니다.\n  * `createOptions`: **선택 사항**. YAML에 지정된 선택적 *생성* 옵션입니다. 자세한 내용은 [컨테이너에서 작업 실행](/ko/enterprise-cloud@latest/actions/how-tos/write-workflows/choose-where-workflows-run/run-jobs-in-a-container#example-running-a-job-within-a-container)을(를) 참조하세요.\n  * `environmentVariables`: **선택 사항**. 주요 환경 변수의 맵을 설정합니다.\n  * `userMountVolumes`: **선택 사항**. 컨테이너에 설치할 마운트 배열입니다. 필드는 위와 동일합니다.\n    * `sourceVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.\n    * `targetVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.\n    * `readOnly`: **필수 사항**. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.\n  * `registry`\n    **선택 사항**. 프라이빗 컨테이너 레지스트리에 대한 Docker 레지스트리 자격 증명입니다.\n    * `username`: **선택 사항**. 레지스트리 계정의 사용자 이름입니다.\n    * `password`: **선택 사항**. 레지스트리 계정의 암호입니다.\n    * `serverUrl`: **선택 사항**. 레지스트리 URL입니다.\n  * `portMappings`: **선택 사항**. 컨테이너에 매핑할 *source:target* 포트의 키 값 해시입니다.\n\n#### `prepare_job`에 대한 입력 예\n\n```json copy\n{\n  \"command\": \"prepare_job\",\n  \"responseFile\": \"/users/octocat/runner/_work/{guid}.json\",\n  \"state\": {},\n  \"args\": {\n    \"jobContainer\": {\n      \"image\": \"node:18\"\n      \"workingDirectory\": \"/__w/octocat-test2/octocat-test2\",\n      \"createOptions\": \"--cpus 1\",\n      \"environmentVariables\": {\n        \"NODE_ENV\": \"development\"\n      },\n      \"userMountVolumes\": [\n        {\n          \"sourceVolumePath\": \"my_docker_volume\",\n          \"targetVolumePath\": \"/volume_mount\",\n          \"readOnly\": false\n        }\n      ],\n      \"systemMountVolumes\": [\n        {\n          \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work\",\n          \"targetVolumePath\": \"/__w\",\n          \"readOnly\": false\n        },\n        {\n          \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/externals\",\n          \"targetVolumePath\": \"/__e\",\n          \"readOnly\": true\n        },\n        {\n          \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp\",\n          \"targetVolumePath\": \"/__w/_temp\",\n          \"readOnly\": false\n        },\n        {\n          \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_actions\",\n          \"targetVolumePath\": \"/__w/_actions\",\n          \"readOnly\": false\n        },\n        {\n          \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_tool\",\n          \"targetVolumePath\": \"/__w/_tool\",\n          \"readOnly\": false\n        },\n        {\n          \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp/_github_home\",\n          \"targetVolumePath\": \"/github/home\",\n          \"readOnly\": false\n        },\n        {\n          \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp/_github_workflow\",\n          \"targetVolumePath\": \"/github/workflow\",\n          \"readOnly\": false\n        }\n      ],\n      \"registry\": {\n        \"username\": \"octocat\",\n        \"password\": \"examplePassword\",\n        \"serverUrl\": \"https://index.docker.io/v1\"\n      },\n      \"portMappings\": { \"80\": \"801\" }\n    },\n    \"services\": [\n      {\n        \"contextName\": \"redis\",\n        \"image\": \"redis\",\n        \"createOptions\": \"--cpus 1\",\n        \"environmentVariables\": {},\n        \"userMountVolumes\": [],\n        \"portMappings\": { \"80\": \"801\" },\n        \"registry\": {\n          \"username\": \"octocat\",\n          \"password\": \"examplePassword\",\n          \"serverUrl\": \"https://index.docker.io/v1\"\n        }\n      }\n    ]\n  }\n}\n```\n\n#### `prepare_job`에 대한 출력 예\n\n이 예제 출력은 위의 입력에 정의된 `responseFile`의 내용입니다.\n\n```json copy\n{\n  \"state\": {\n    \"network\": \"example_network_53269bd575972817b43f7733536b200c\",\n    \"jobContainer\": \"82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480\",\n    \"serviceContainers\": {\n      \"redis\": \"60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105\"\n    }\n  },\n  \"context\": {\n    \"container\": {\n      \"id\": \"82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480\",\n      \"network\": \"example_network_53269bd575972817b43f7733536b200c\"\n    },\n    \"services\": {\n      \"redis\": {\n        \"id\": \"60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105\",\n        \"ports\": {\n          \"8080\": \"8080\"\n        },\n        \"network\": \"example_network_53269bd575972817b43f7733536b200c\"\n      }\n    },\n    \"isAlpine\": true\n  }\n}\n```\n\n### `cleanup_job`\n\n작업이 종료될 때 `cleanup_job` 명령이 호출됩니다.\nGitHub Actions\n`cleanup_job` 명령에서 다음 작업을 수행할 것으로 가정합니다:\n\n* 실행 중인 서비스 또는 작업 컨테이너(또는 동등한 포드)를 중지합니다.\n* 네트워크를 중지합니다(있는 경우).\n* 작업 또는 서비스 컨테이너(또는 동등한 Pod)를 모두 삭제합니다.\n* 네트워크를 삭제합니다(있는 경우).\n* 작업을 위해 만들어진 다른 항목들을 모두 정리합니다.\n\n#### `cleanup_job`의 인수\n\n`cleanup_job`에 대한 인수는 제공되지 않습니다.\n\n#### `cleanup_job`에 대한 입력 예\n\n```json copy\n{\n  \"command\": \"cleanup_job\",\n  \"responseFile\": null,\n  \"state\": {\n    \"network\": \"example_network_53269bd575972817b43f7733536b200c\",\n    \"jobContainer\": \"82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480\",\n    \"serviceContainers\": {\n      \"redis\": \"60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105\"\n    }\n  },\n  \"args\": {}\n}\n```\n\n#### `cleanup_job`에 대한 출력 예\n\n`cleanup_job`에 대한 출력은 필요하지 않습니다.\n\n### `run_container_step`\n\n`run_container_step` 명령은 작업의 각 컨테이너 작업에 대해 한 번씩 호출됩니다.\nGitHub Actions\n`run_container_step` 명령에서 다음 작업을 수행할 것으로 가정합니다:\n\n* 필요한 컨테이너를 끌어오거나 빌드합니다(불가능할 경우 실패함).\n* 컨테이너 작업을 실행하고 컨테이너의 종료 코드를 반환합니다.\n* 모든 단계 로그 출력을 stdout 및 stderr로 스트리밍합니다.\n* 실행 후 컨테이너를 정리합니다.\n\n#### `run_container_step`의 인수\n\n* `image`: **선택 사항**. Docker 이미지를 포함하는 문자열입니다. 그렇지 않으면 dockerfile을 제공해야 합니다.\n* `dockerfile`: **선택 사항**. Dockerfile에 대한 경로를 포함하는 문자열입니다. 그렇지 않으면 이미지를 제공해야 합니다.\n* `entryPointArgs`: **선택 사항**. 진입점 인수를 포함하는 목록입니다.\n* `entryPoint`: **선택 사항**. 기본 이미지 진입점을 덮어써야 하는 경우 사용할 컨테이너 진입점입니다.\n* `workingDirectory`: **필수 사항**. 작업 디렉터리의 절대 경로를 포함하는 문자열입니다.\n* `createOptions`: **선택 사항**. YAML에 지정된 선택적 *생성* 옵션입니다. 자세한 내용은 [컨테이너에서 작업 실행](/ko/enterprise-cloud@latest/actions/how-tos/write-workflows/choose-where-workflows-run/run-jobs-in-a-container#example-running-a-job-within-a-container)을(를) 참조하세요.\n* `environmentVariables`: **선택 사항**. 주요 환경 변수의 맵을 설정합니다.\n* `prependPath`: **선택 사항**.\n  `$PATH` 변수 앞에 추가할 추가 경로의 배열입니다.\n* `userMountVolumes`: **선택 사항**. YAML에 설정된 사용자 탑재 볼륨의 배열입니다. 자세한 내용은 [컨테이너에서 작업 실행](/ko/enterprise-cloud@latest/actions/how-tos/write-workflows/choose-where-workflows-run/run-jobs-in-a-container#example-running-a-job-within-a-container)을(를) 참조하세요.\n  * `sourceVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.\n  * `targetVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.\n  * `readOnly`: **필수 사항**. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.\n* `systemMountVolumes`: **필수 사항**. 위에 동일한 필드를 사용하여 컨테이너에 설치할 마운트 배열입니다.\n  * `sourceVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 원본 경로입니다.\n  * `targetVolumePath`: **필수 사항**. Docker 컨테이너에 탑재될 볼륨의 대상 경로입니다.\n  * `readOnly`: **필수 사항**. 탑재가 읽기 전용이어야 하는지 여부를 결정합니다.\n* `registry`\n  **선택 사항**. 프라이빗 컨테이너 레지스트리에 대한 Docker 레지스트리 자격 증명입니다.\n  * `username`: **선택 사항**. 레지스트리 계정의 사용자 이름입니다.\n  * `password`: **선택 사항**. 레지스트리 계정의 암호입니다.\n  * `serverUrl`: **선택 사항**. 레지스트리 URL입니다.\n* `portMappings`: **선택 사항**. 컨테이너에 매핑할 *source:target* 포트의 키 값 해시입니다.\n\n#### 이미지에 대한 예제 입력\n\nDocker 이미지를 사용하는 경우 `\"image\":` 매개 변수에 이미지 이름을 지정할 수 있습니다.\n\n```json copy\n{\n  \"command\": \"run_container_step\",\n  \"responseFile\": null,\n  \"state\": {\n    \"network\": \"example_network_53269bd575972817b43f7733536b200c\",\n    \"jobContainer\": \"82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480\",\n    \"serviceContainers\": {\n      \"redis\": \"60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105\"\n    }\n  },\n  \"args\": {\n    \"image\": \"node:18\",\n    \"dockerfile\": null,\n    \"entryPointArgs\": [\"-f\", \"/dev/null\"],\n    \"entryPoint\": \"tail\",\n    \"workingDirectory\": \"/__w/octocat-test2/octocat-test2\",\n    \"createOptions\": \"--cpus 1\",\n    \"environmentVariables\": {\n      \"NODE_ENV\": \"development\"\n    },\n    \"prependPath\": [\"/foo/bar\", \"bar/foo\"],\n    \"userMountVolumes\": [\n      {\n        \"sourceVolumePath\": \"my_docker_volume\",\n        \"targetVolumePath\": \"/volume_mount\",\n        \"readOnly\": false\n      }\n    ],\n    \"systemMountVolumes\": [\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work\",\n        \"targetVolumePath\": \"/__w\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/externals\",\n        \"targetVolumePath\": \"/__e\",\n        \"readOnly\": true\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp\",\n        \"targetVolumePath\": \"/__w/_temp\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_actions\",\n        \"targetVolumePath\": \"/__w/_actions\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_tool\",\n        \"targetVolumePath\": \"/__w/_tool\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp/_github_home\",\n        \"targetVolumePath\": \"/github/home\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp/_github_workflow\",\n        \"targetVolumePath\": \"/github/workflow\",\n        \"readOnly\": false\n      }\n    ],\n    \"registry\": null,\n    \"portMappings\": { \"80\": \"801\" }\n  }\n}\n```\n\n#### Dockerfile에 대한 예제 입력\n\n컨테이너가 Dockerfile에 의해 정의된 경우 이 예제에서는 `Dockerfile` 매개 변수를 사용하여 입력에 `\"dockerfile\":` 경로를 지정하는 방법을 보여줍니다.\n\n```json copy\n{\n  \"command\": \"run_container_step\",\n  \"responseFile\": null,\n  \"state\": {\n    \"network\": \"example_network_53269bd575972817b43f7733536b200c\",\n    \"jobContainer\": \"82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480\",\n    \"services\": {\n      \"redis\": \"60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105\"\n    }\n  },\n  \"args\": {\n    \"image\": null,\n    \"dockerfile\": \"/__w/_actions/foo/dockerfile\",\n    \"entryPointArgs\": [\"hello world\"],\n    \"entryPoint\": \"echo\",\n    \"workingDirectory\": \"/__w/octocat-test2/octocat-test2\",\n    \"createOptions\": \"--cpus 1\",\n    \"environmentVariables\": {\n      \"NODE_ENV\": \"development\"\n    },\n    \"prependPath\": [\"/foo/bar\", \"bar/foo\"],\n    \"userMountVolumes\": [\n      {\n        \"sourceVolumePath\": \"my_docker_volume\",\n        \"targetVolumePath\": \"/volume_mount\",\n        \"readOnly\": false\n      }\n    ],\n    \"systemMountVolumes\": [\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work\",\n        \"targetVolumePath\": \"/__w\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/externals\",\n        \"targetVolumePath\": \"/__e\",\n        \"readOnly\": true\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp\",\n        \"targetVolumePath\": \"/__w/_temp\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_actions\",\n        \"targetVolumePath\": \"/__w/_actions\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_tool\",\n        \"targetVolumePath\": \"/__w/_tool\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp/_github_home\",\n        \"targetVolumePath\": \"/github/home\",\n        \"readOnly\": false\n      },\n      {\n        \"sourceVolumePath\": \"/home/octocat/git/runner/_layout/_work/_temp/_github_workflow\",\n        \"targetVolumePath\": \"/github/workflow\",\n        \"readOnly\": false\n      }\n    ],\n    \"registry\": null,\n    \"portMappings\": { \"80\": \"801\" }\n  }\n}\n```\n\n#### `run_container_step`에 대한 출력 예\n\n`run_container_step`에 대한 출력은 필요하지 않습니다.\n\n### `run_script_step`\n\nGitHub Actions 에서는 다음 작업을 수행한다고 가정합니다.\n\n* 작업 컨테이너 내에서 제공된 스크립트를 호출하고 종료 코드를 반환합니다.\n* 모든 단계 로그 출력을 stdout 및 stderr로 스트리밍합니다.\n\n#### `run_script_step`의 인수\n\n* `entryPointArgs`: **선택 사항**. 진입점 인수를 포함하는 목록입니다.\n* `entryPoint`: **선택 사항**. 기본 이미지 진입점을 덮어써야 하는 경우 사용할 컨테이너 진입점입니다.\n* `prependPath`: **선택 사항**.\n  `$PATH` 변수 앞에 추가할 추가 경로의 배열입니다.\n* `workingDirectory`: **필수 사항**. 작업 디렉터리의 절대 경로를 포함하는 문자열입니다.\n* `environmentVariables`: **선택 사항**. 주요 환경 변수의 맵을 설정합니다.\n\n#### `run_script_step`에 대한 입력 예\n\n```json copy\n{\n  \"command\": \"run_script_step\",\n  \"responseFile\": null,\n  \"state\": {\n    \"network\": \"example_network_53269bd575972817b43f7733536b200c\",\n    \"jobContainer\": \"82e8219701fe096a35941d869cf3d71af1d943b5d8bdd718857fb87ac3042480\",\n    \"serviceContainers\": {\n      \"redis\": \"60972d9aa486605e66b0dad4abb678dc3d9116f536579e418176eedb8abb9105\"\n    }\n  },\n  \"args\": {\n    \"entryPointArgs\": [\"-e\", \"/runner/temp/example.sh\"],\n    \"entryPoint\": \"bash\",\n    \"environmentVariables\": {\n      \"NODE_ENV\": \"development\"\n    },\n    \"prependPath\": [\"/foo/bar\", \"bar/foo\"],\n    \"workingDirectory\": \"/__w/octocat-test2/octocat-test2\"\n  }\n}\n```\n\n#### `run_script_step`에 대한 출력 예\n\n`run_script_step`에 대한 출력은 필요하지 않습니다.\n\n## 사용자 지정 스크립트 생성\n\nGitHub 에서는 Docker 및 Kubernetes에 대한 사용자 지정 스크립트를 생성하는 방법을 보여 주는 예제 리포지토리를 만들었습니다.\n\n> \\[!NOTE]\n> 결과 스크립트는 테스트 목적으로 사용할 수 있으며 사용자는 해당 스크립트가 요구 사항에 적합한지 확인해야 합니다.\n\n1. [actions/runner-container-hooks](https://github.com/actions/runner-container-hooks) 리포지토리를 자체 호스트형 실행기에 복제합니다.\n\n2. `examples/` 디렉터리에는 각각 고유한 JSON 파일이 있는 기존 사용자 지정 명령이 일부 포함되어 있습니다. 이러한 예제를 검토하고 사용자 지정 명령의 시작점으로 사용할 수 있습니다.\n\n   * `prepare_job.json`\n   * `run_script_step.json`\n   * `run_container_step.json`\n\n3. npm 패키지를 빌드합니다. 다음 명령은 `index.js` 및 `packages/docker/dist` 내부에서 `packages/k8s/dist` 파일을 생성합니다.\n\n   ```shell\n   npm install && npm run bootstrap && npm run build-all\n   ```\n\n결과로 생성된 `index.js`이(가) GitHub Actions에 의해 트리거되면 JSON 파일에 정의된 사용자 지정 명령을 실행합니다.\n`index.js`를 트리거하려면 다음 섹션에 설명된 대로 `ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER` 환경 변수를 추가해야 합니다.\n\n## 사용자 지정 스크립트를 실행하기\n\n사용자 지정 스크립트는 런처에 있어야 하지만 자체 호스팅된 런처 애플리케이션 디렉토리(즉, 런처 소프트웨어를 다운로드하고 압축을 푼 디렉토리)에 저장되어서는 안 됩니다. 스크립트는 실행기를 작동시키는 서비스 계정의 보안 컨텍스트에서 실행됩니다.\n\n> \\[!NOTE]\n> 트리거된 스크립트는 동기적으로 처리되므로 실행되는 동안 작업 실행을 차단합니다.\n\n실행기에 스크립트의 절대 경로를 포함하는 다음 환경 변수가 있는 경우 스크립트가 자동으로 실행됩니다.\n\n* `ACTIONS_RUNNER_CONTAINER_HOOKS`: 작업이 실행기에 할당된 경우 작업 실행이 시작되기 전에 이 환경 변수에 정의된 스크립트가 트리거됩니다.\n\n이 환경 변수를 설정하기 위해 운영 체제에 추가하거나, 자체 호스트형 실행기 애플리케이션 디렉터리 내의 `.env` 파일에 추가할 수 있습니다. 예를 들어 다음 `.env` 항목은 각 컨테이너 기반 작업이 실행되기 전에 실행기가 `/Users/octocat/runner/index.js`에서 스크립트를 자동으로 실행하도록 합니다.\n\n```bash\nACTIONS_RUNNER_CONTAINER_HOOKS=/Users/octocat/runner/index.js\n```\n\n작업이 항상 컨테이너 내부에서 실행되고 이후에 항상 컨테이너 사용자 지정을 적용하도록 하려면 자체 호스팅 실행기에서 `ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER` 변수를 `true`로 설정할 수 있습니다. 이렇게 하면 작업 컨테이너를 지정하지 않는 작업이 실패합니다.\n\n## 문제 해결\n\n### 시간 제한 설정 없음\n\n현재 `ACTIONS_RUNNER_CONTAINER_HOOKS`에서 실행하는 스크립트에 사용할 수 있는 시간 제한 설정이 없습니다. 따라서 스크립트에 시간 제한 처리를 추가하는 것이 좋습니다.\n\n### 워크플로 실행 로그 검토\n\n스크립트가 실행되고 있는지 확인하기 위해 해당 작업에 대한 로그를 검토할 수 있습니다. 로그 확인에 대한 자세한 내용은 [워크플로 실행 로그 사용](/ko/enterprise-cloud@latest/actions/how-tos/monitor-workflows/use-workflow-run-logs#viewing-logs-to-diagnose-failures)을(를) 참조하세요."}