{"meta":{"title":"Personalizar los contenedores utilizados por los trabajos","intro":"Puedes personalizar la forma en la que el ejecutor auto hospedado invoca un contenedor para un trabajo.","product":"GitHub Actions","breadcrumbs":[{"href":"/es/enterprise-cloud@latest/actions","title":"GitHub Actions"},{"href":"/es/enterprise-cloud@latest/actions/how-tos","title":"Procedimientos"},{"href":"/es/enterprise-cloud@latest/actions/how-tos/manage-runners","title":"Gestión de corredores"},{"href":"/es/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners","title":"Ejecutores autohospedados"},{"href":"/es/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers","title":"Personalización de contenedores"}],"documentType":"article"},"body":"# Personalizar los contenedores utilizados por los trabajos\n\nPuedes personalizar la forma en la que el ejecutor auto hospedado invoca un contenedor para un trabajo.\n\n> \\[!NOTE]\n> Esta característica está actualmente en versión preliminar pública y está sujeta a cambios.\n\n## Acerca de la personalización del contenedor\n\nGitHub Actions permite ejecutar un trabajo dentro de un contenedor mediante la instrucción `container:` en el archivo de flujo de trabajo. Para más información, consulta [Ejecutar trabajos en un contenedor](/es/enterprise-cloud@latest/actions/how-tos/write-workflows/choose-where-workflows-run/run-jobs-in-a-container). Para procesar trabajos basados en contenedores, el ejecutor auto hospedado crea un contenedor para cada trabajo.\n\nGitHub Actions admite comandos que permiten personalizar la forma en que el ejecutor autohospedado crea los contenedores. Por ejemplo, puede usar estos comandos para administrar los contenedores a través de Kubernetes o Podman, y también puede personalizar los comandos `docker run` o `docker create` que se usan para invocar el contenedor. Los comandos de personalización se ejecutan mediante un script, que se desencadena de forma automática cuando se establece una variable de entorno específica en el ejecutor. Para obtener más información, consulta la sección [Ejecutar el script de personalización](#triggering-the-customization-script) a continuación.\n\nEsta personalización solo está disponible para los ejecutores auto hospedados basados en Linux y no se requiere acceso de usuario raíz.\n\n## Comandos de personalización de contenedor\n\nGitHub Actions incluye los siguientes comandos para la personalización del contenedor:\n\n* [\n  `prepare_job`\n  ](/es/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#prepare_job): se llama cuando se inicia un trabajo.\n* [\n  `cleanup_job`\n  ](/es/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#cleanup_job): se llama al final de un trabajo.\n* [\n  `run_container_step`\n  ](/es/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#run_container_step): se llama una vez para cada acción de contenedor en el trabajo.\n* [\n  `run_script_step`\n  ](/es/enterprise-cloud@latest/actions/how-tos/manage-runners/self-hosted-runners/customize-containers#run_script_step): ejecuta cualquier paso que no sea una acción de contenedor.\n\nCada uno de estos comandos de personalización debe definirse en su propio archivo JSON. El nombre de archivo debe coincidir con el nombre del comando, con la extensión `.json`. Por ejemplo, el comando `prepare_job` se define en `prepare_job.json`. Estos archivos JSON se ejecutarán juntos en el ejecutor auto hospedado, como parte del script principal `index.js`. Este proceso se describe con más detalle en [Generación del script de personalización](#generating-the-customization-script).\n\nEstos comandos también incluyen argumentos de configuración, que se explican a continuación con más detalle.\n\n### `prepare_job`\n\nSe llama al comando `prepare_job` cuando se inicia un trabajo.\nGitHub Actions transmite los contenedores de trabajo o de servicio que tenga el trabajo. Se llamará a este comando si tiene algún servicio o contenedores de trabajos en el trabajo.\n\nGitHub Actions supone que realizará las siguientes tareas en el `prepare_job` comando :\n\n* Eliminar cualquier cosa de los trabajos anteriores, si es necesario.\n* Crear una red, si es necesario.\n* Extraer el trabajo y los contenedores de servicio.\n* Iniciar el contenedor de tareas.\n* Iniciar los contenedores de servicio.\n* Escriba en el archivo de respuesta cualquier información que GitHub Actions necesite:\n  * Obligatorio: indique si el contenedor es un contenedor de Linux `alpine` (mediante el valor booleano `isAlpine`).\n  * Opcional: los campos de contexto que quiera establecer en el contexto del trabajo, de lo contrario, no estarán disponibles para que los usuarios los usen. Para más información, consulta [Contextos de referencia](/es/enterprise-cloud@latest/actions/reference/workflows-and-actions/contexts#job-context).\n* Devuelve `0` cuando las comprobaciones de estado se han realizado correctamente y se inician los contenedores de trabajo o servicio.\n\n#### Argumentos para `prepare_job`\n\n* `jobContainer`: **Opcional**. Objeto que contiene información sobre el contenedor de tareas especificado.\n  * `image`: **Obligatorio**. Cadena que contiene la imagen de Docker.\n  * `workingDirectory`: **Obligatorio**. Cadena que contiene la ruta de acceso absoluta del directorio de trabajo.\n  * `createOptions`: **Opcional**. Opciones de *creación* opcionales especificadas en YAML. Para más información, consulta [Ejecutar trabajos en un contenedor](/es/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`: **Opcional**. Establece un mapa de variables de entorno clave.\n  * `userMountVolumes`: **Opcional**. Matriz de volúmenes de montaje de usuarios establecidos en YAML. Para más información, consulta [Ejecutar trabajos en un contenedor](/es/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`: **Obligatorio**. La ruta de acceso de origen al volumen que se montará en el contenedor de Docker.\n    * `targetVolumePath`: **Obligatorio**. La ruta de acceso de destino al volumen que se montará en el contenedor de Docker.\n    * `readOnly`: **Obligatorio**. Determina si el montaje debe ser de solo lectura.\n  * `systemMountVolumes`: **Obligatorio**. Matriz de montajes que se van a montar en el contenedor, los mismos campos que los anteriores.\n    * `sourceVolumePath`: **Obligatorio**. La ruta de acceso de origen al volumen que se montará en el contenedor de Docker.\n    * `targetVolumePath`: **Obligatorio**. La ruta de acceso de destino al volumen que se montará en el contenedor de Docker.\n    * `readOnly`: **Obligatorio**. Determina si el montaje debe ser de solo lectura.\n  * `registry`\n    **Opcional**. Credenciales del registro de Docker para un registro de contenedor privado.\n    * `username`: **Opcional**. Nombre de usuario de la cuenta de registro.\n    * `password`: **Opcional**. Contraseña de la cuenta de registro.\n    * `serverUrl`: **Opcional**. Dirección URL del registro.\n  * `portMappings`: **Opcional**. Código hash de valor de clave de los puertos *source:target* que se van a asignar al contenedor.\n* `services`: **Opcional**. Matriz de contenedores de servicio que se va a poner en marcha.\n  * `contextName`: **Obligatorio**. Nombre del servicio en el contexto del trabajo.\n  * `image`: **Obligatorio**. Cadena que contiene la imagen de Docker.\n  * `createOptions`: **Opcional**. Opciones de *creación* opcionales especificadas en YAML. Para más información, consulta [Ejecutar trabajos en un contenedor](/es/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`: **Opcional**. Establece un mapa de variables de entorno clave.\n  * `userMountVolumes`: **Opcional**. Matriz de montajes que se van a montar en el contenedor, los mismos campos que los anteriores.\n    * `sourceVolumePath`: **Obligatorio**. La ruta de acceso de origen al volumen que se montará en el contenedor de Docker.\n    * `targetVolumePath`: **Obligatorio**. La ruta de acceso de destino al volumen que se montará en el contenedor de Docker.\n    * `readOnly`: **Obligatorio**. Determina si el montaje debe ser de solo lectura.\n  * `registry`\n    **Opcional**. Credenciales del registro de Docker para un registro de contenedor privado.\n    * `username`: **Opcional**. Nombre de usuario de la cuenta de registro.\n    * `password`: **Opcional**. Contraseña de la cuenta de registro.\n    * `serverUrl`: **Opcional**. Dirección URL del registro.\n  * `portMappings`: **Opcional**. Código hash de valor de clave de los puertos *source:target* que se van a asignar al contenedor.\n\n#### Entrada de ejemplo para `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#### Salida de ejemplo para `prepare_job`\n\nEsta salida de ejemplo es el contenido de `responseFile` definido en la entrada anterior.\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\nSe llama al comando `cleanup_job` al final de un trabajo.\nGitHub Actions supone que realizará las siguientes tareas en el `cleanup_job` comando :\n\n* Detener cualquier servicio o contenedor de trabajos en ejecución (o el pod equivalente).\n* Detener la red (si existe).\n* Eliminar los contenedores de trabajos o servicios (o el pod equivalente).\n* Eliminar la red (si existe).\n* Limpiar cualquier otra cosa que se haya creado para el trabajo.\n\n#### Argumentos para `cleanup_job`\n\nNo se proporciona ningún argumento para `cleanup_job`.\n\n#### Entrada de ejemplo para `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#### Salida de ejemplo para `cleanup_job`\n\nNo se espera ninguna salida para `cleanup_job`.\n\n### `run_container_step`\n\nEl comando `run_container_step` se llama una vez por cada acción de contenedor en tu trabajo.\nGitHub Actions supone que realizará las siguientes tareas en el `run_container_step` comando :\n\n* Extraer o compilar el contenedor necesario (o generar un error si no es posible).\n* Ejecuta la acción del contenedor y devuelve el código de salida del contenedor.\n* Transmitir los registros de salida de cualquier paso a stdout y stderr.\n* Limpiar el contenedor después de ejecutarlo.\n\n#### Argumentos para `run_container_step`\n\n* `image`: **Opcional**. Cadena que contiene la imagen de Docker. De lo contrario, se debe proporcionar un dockerfile.\n* `dockerfile`: **Opcional**. Cadena que contiene la ruta de acceso al Dockerfile; de lo contrario, se debe proporcionar una imagen.\n* `entryPointArgs`: **Opcional**. Lista que contiene los argumentos del punto de entrada.\n* `entryPoint`: **Opcional**. Punto de entrada del contenedor que se va a usar si se debe sobrescribir el punto de entrada de imagen predeterminado.\n* `workingDirectory`: **Obligatorio**. Cadena que contiene la ruta de acceso absoluta del directorio de trabajo.\n* `createOptions`: **Opcional**. Opciones de *creación* opcionales especificadas en YAML. Para más información, consulta [Ejecutar trabajos en un contenedor](/es/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`: **Opcional**. Establece un mapa de variables de entorno clave.\n* `prependPath`: **Opcional**. Matriz de rutas de acceso adicionales que se anteponen a la variable `$PATH`.\n* `userMountVolumes`: **Opcional**. una matriz de volúmenes de montaje de usuario establecidos en YAML. Para más información, consulta [Ejecutar trabajos en un contenedor](/es/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`: **Obligatorio**. La ruta de acceso de origen al volumen que se montará en el contenedor de Docker.\n  * `targetVolumePath`: **Obligatorio**. La ruta de acceso de destino al volumen que se montará en el contenedor de Docker.\n  * `readOnly`: **Obligatorio**. Determina si el montaje debe ser de solo lectura.\n* `systemMountVolumes`: **Obligatorio**. Matriz de puntos de montaje para instalar en el contenedor, utilizando los mismos campos indicados anteriormente.\n  * `sourceVolumePath`: **Obligatorio**. La ruta de acceso de origen al volumen que se montará en el contenedor de Docker.\n  * `targetVolumePath`: **Obligatorio**. La ruta de acceso de destino al volumen que se montará en el contenedor de Docker.\n  * `readOnly`: **Obligatorio**. Determina si el montaje debe ser de solo lectura.\n* `registry`\n  **Opcional**. Credenciales del registro de Docker para un registro de contenedor privado.\n  * `username`: **Opcional**. Nombre de usuario de la cuenta de registro.\n  * `password`: **Opcional**. Contraseña de la cuenta de registro.\n  * `serverUrl`: **Opcional**. Dirección URL del registro.\n* `portMappings`: **Opcional**. Código hash de valor de clave de los puertos *source:target* que se van a asignar al contenedor.\n\n#### Entrada de ejemplo para la imagen\n\nSi usa una imagen de Docker, puede especificar el nombre de la imagen en el parámetro `\"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#### Entrada de ejemplo para Dockerfile\n\nSi un Dockerfile define el contenedor, en este ejemplo se muestra cómo especificar la ruta de acceso a `Dockerfile` en la entrada mediante el parámetro `\"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#### Salida de ejemplo para `run_container_step`\n\nNo se espera ninguna salida para `run_container_step`.\n\n### `run_script_step`\n\nGitHub Actions supone que realizará las siguientes tareas:\n\n* Invocar el script proporcionado dentro del contenedor de trabajos y devolver el código de salida.\n* Transmitir cualquier salida del registro de pasos a stdout y stderr.\n\n#### Argumentos para `run_script_step`\n\n* `entryPointArgs`: **Opcional**. Lista que contiene los argumentos del punto de entrada.\n* `entryPoint`: **Opcional**. Punto de entrada del contenedor que se va a usar si se debe sobrescribir el punto de entrada de imagen predeterminado.\n* `prependPath`: **Opcional**. Matriz de rutas de acceso adicionales que se anteponen a la variable `$PATH`.\n* `workingDirectory`: **Obligatorio**. Cadena que contiene la ruta de acceso absoluta del directorio de trabajo.\n* `environmentVariables`: **Opcional**. Establece un mapa de variables de entorno clave.\n\n#### Entrada de ejemplo para `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#### Salida de ejemplo para `run_script_step`\n\nNo se espera ninguna salida para `run_script_step`.\n\n## Generación del script de personalización\n\nGitHub ha creado un repositorio de ejemplo que muestra cómo generar scripts de personalización para Docker y Kubernetes.\n\n> \\[!NOTE]\n> Los scripts resultantes están disponibles para fines de prueba y deberás determinar si son adecuados para tus requisitos.\n\n1. Clona el repositorio [actions/runner-container-hooks](https://github.com/actions/runner-container-hooks) en el ejecutor auto hospedado.\n\n2. El directorio `examples/` contiene algunos comandos de personalización existentes, cada uno con su propio archivo JSON. Puedes revisar estos ejemplos y usarlos como punto de partida para tus propios comandos de personalización.\n\n   * `prepare_job.json`\n   * `run_script_step.json`\n   * `run_container_step.json`\n\n3. Compila los paquetes de npm. Estos comandos generan los archivos `index.js` dentro de `packages/docker/dist` y `packages/k8s/dist`.\n\n   ```shell\n   npm install && npm run bootstrap && npm run build-all\n   ```\n\nCuando el resultado `index.js` se desencadena mediante GitHub Actions, ejecutará los comandos de personalización definidos en los archivos JSON. Para desencadenar `index.js`, deberás agregarla a la variable de entorno `ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER`, como se describe en la sección siguiente.\n\n## Desencadenamiento del script de personalización\n\nEl script personalizado debe estar ubicado en el ejecutor, pero no se debe almacenar en el directorio auto hospedado de la aplicación (esto es, el directorio en el que descargó y desempaquetó el software del ejecutor). Los scripts se ejecutan en el contexto de seguridad de la cuenta de servicio que ejecuta el servicio del ejecutor.\n\n> \\[!NOTE]\n> El script desencadenado se procesa de forma sincrónica, por lo que bloqueará la ejecución del trabajo mientras se ejecuta.\n\nEl script se ejecuta de forma automática cuando el ejecutor tiene la siguiente variable de entorno que contiene una ruta de acceso absoluta al script:\n\n* `ACTIONS_RUNNER_CONTAINER_HOOKS`: el script definido en esta variable de entorno se desencadena cuando se ha asignado un trabajo a un ejecutor, pero antes de que el trabajo empiece a ejecutarse.\n\nPara establecer esta variable de entorno, puedes agregarla al sistema operativo o a un archivo denominado `.env` dentro del directorio de aplicaciones del ejecutor auto hospedado. Por ejemplo, la siguiente entrada `.env` hará que el ejecutor ejecute automáticamente el script en `/Users/octocat/runner/index.js` antes de que se ejecute cada trabajo basado en contenedor:\n\n```bash\nACTIONS_RUNNER_CONTAINER_HOOKS=/Users/octocat/runner/index.js\n```\n\nSi quieres asegurarte de que el trabajo siempre se ejecuta dentro de un contenedor y, posteriormente, siempre aplica las personalizaciones del contenedor, puedes establecer la variable `ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER` en el ejecutor auto hospedado en `true`. Se producirá un error en los trabajos que no especifican un contenedor de trabajo.\n\n## Solución de problemas\n\n### Sin configuración de tiempo de espera\n\nActualmente no hay ninguna configuración de tiempo de espera disponible para el script ejecutado por `ACTIONS_RUNNER_CONTAINER_HOOKS`. Como resultado, podría considerar la posibilidad de agregar el control de tiempo de espera al script.\n\n### Revisión del registro de ejecución del flujo de trabajo\n\nPara confirmar si los scripts se están ejecutando, puede revisar los registros de ejecución de esa tarea. Para obtener más información sobre la comprobación de los registros, consulta [Uso de registros de flujo de trabajo](/es/enterprise-cloud@latest/actions/how-tos/monitor-workflows/use-workflow-run-logs#viewing-logs-to-diagnose-failures)."}