{"meta":{"title":"Настройка контейнеров, используемых заданиями","intro":"Вы можете настроить, как локальное средство выполнения вызывает контейнер для задания.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/how-tos","title":"Инструкции"},{"href":"/ru/actions/how-tos/manage-runners","title":"Управление средствами выполнения"},{"href":"/ru/actions/how-tos/manage-runners/self-hosted-runners","title":"Локальные средства выполнения тестов"},{"href":"/ru/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:` инструкции в файле рабочего процесса. Дополнительные сведения см. в разделе [Выполнение заданий в контейнере](/ru/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  ](/ru/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#prepare_job): вызывается при запуске задания.\n* [\n  `cleanup_job`\n  ](/ru/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#cleanup_job): вызывается в конце задания.\n* [\n  `run_container_step`\n  ](/ru/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#run_container_step): вызывается один раз для каждого действия контейнера в задании.\n* [\n  `run_script_step`\n  ](/ru/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 Предполагает, что в команде `prepare_job` будут выполняться следующие задачи:\n\n* Урезать что-либо из предыдущих заданий при необходимости.\n* При необходимости создайте сеть.\n* Извлеките контейнеры заданий и служб.\n* Запустите контейнер заданий.\n* Запустите контейнеры служб.\n* Напишите в файл ответа все необходимые сведения GitHub Actions :\n  * Обязательный аргумент. Указывает, является ли контейнер контейнером Linux `alpine` (с использованием логического значения `isAlpine`).\n  * Необязательный аргумент. Поля контекста, которые нужно задать для контекста задания. В противном случае они будут недоступны для пользователей. Дополнительные сведения см. в разделе [Справочник по контекстам](/ru/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. Дополнительные сведения см. в разделе [Выполнение заданий в контейнере](/ru/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. Дополнительные сведения см. в разделе [Выполнение заданий в контейнере](/ru/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`: **необязательный**. Учетные данные реестра Docker для частного реестра контейнеров.\n    * `username`: **необязательный**. Имя пользователя для учетной записи реестра.\n    * `password`: **необязательный**. Пароль для учетной записи реестра.\n    * `serverUrl`: **необязательный**. URL-адрес реестра.\n  * `portMappings`: **необязательный**. Хэш значения ключа портов *исходный:целевой* для сопоставления с контейнером.\n* `services`: **необязательный**. Массив контейнеров служб для запуска.\n  * `contextName`: **обязательный**. Имя службы в контексте задания.\n  * `image`: **обязательный**. Строка, содержащая образ Docker.\n  * `createOptions`: **необязательный**. Необязательные параметры *создания*, указанные в YAML. Дополнительные сведения см. в разделе [Выполнение заданий в контейнере](/ru/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`: **необязательный**. Учетные данные реестра Docker для частного реестра контейнеров.\n    * `username`: **необязательный**. Имя пользователя для учетной записи реестра.\n    * `password`: **необязательный**. Пароль для учетной записи реестра.\n    * `serverUrl`: **необязательный**. URL-адрес реестра.\n  * `portMappings`: **необязательный**. Хэш значения ключа портов *исходный:целевой* для сопоставления с контейнером.\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 Предполагает, что в команде `cleanup_job` будут выполняться следующие задачи:\n\n* Остановите все запущенные контейнеры служб или заданий (или эквивалентный объект pod).\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 Предполагает, что в команде `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. Дополнительные сведения см. в разделе [Выполнение заданий в контейнере](/ru/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`: **необязательный**. Массив дополнительных путей, которые необходимо добавить перед переменной `$PATH`.\n* `userMountVolumes`: **необязательный**. Массив пользовательских томов подключения, заданных в YAML. Дополнительные сведения см. в разделе [Выполнение заданий в контейнере](/ru/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`: **необязательный**. Учетные данные реестра Docker для частного реестра контейнеров.\n  * `username`: **необязательный**. Имя пользователя для учетной записи реестра.\n  * `password`: **необязательный**. Пароль для учетной записи реестра.\n  * `serverUrl`: **необязательный**. URL-адрес реестра.\n* `portMappings`: **необязательный**. Хэш значения ключа портов *исходный:целевой* для сопоставления с контейнером.\n\n#### Пример входных данных для образа\n\nЕсли вы используете образ Docker, можно указать имя образа в параметре `\"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`: **необязательный**. Массив дополнительных путей, которые необходимо добавить перед переменной `$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-файлах. Чтобы активировать `index.js`эту переменную, необходимо добавить ее в `ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER` переменную среды, как описано в следующем разделе.\n\n## Активация скрипта настройки\n\nПользовательский скрипт должен находиться в средстве выполнения, но не должен храниться в локальном каталоге приложений runner (то есть каталог, в который вы скачали и распаковали программное обеспечение runner). Скрипты выполняются в контексте безопасности учетной записи службы, в котором запущена служба средства выполнения.\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Чтобы проверить, выполняются ли скрипты, можно просмотреть журналы задания. Дополнительные сведения о проверке журналов см. в разделе [Использование журналов выполнения рабочих процессов](/ru/actions/how-tos/monitor-workflows/use-workflow-run-logs#viewing-logs-to-diagnose-failures)."}