{"meta":{"title":"Creación de una acción de contenedor de Docker","intro":"En este tutorial, aprenderás cómo crear una acción de contenedor Docker.","product":"GitHub Actions","breadcrumbs":[{"href":"/es/actions","title":"GitHub Actions"},{"href":"/es/actions/tutorials","title":"Tutoriales"},{"href":"/es/actions/tutorials/use-containerized-services","title":"Uso de servicios de contenedor"},{"href":"/es/actions/tutorials/use-containerized-services/create-a-docker-container-action","title":"Creación de una acción de contenedor Docker"}],"documentType":"article"},"body":"# Creación de una acción de contenedor de Docker\n\nEn este tutorial, aprenderás cómo crear una acción de contenedor Docker.\n\n## Introducción\n\nEsta guía te muestra los pasos mínimos necesarios para desarrollar una acción de contenedor de Docker. Para centrar esta guía en los componentes necesarios para empaquetar la acción, la funcionalidad del código de la acción es mínima. La acción imprime \"Hola mundo\" en los registros o \"Hello \\[who-to-greet]\"si proporcionas un nombre personalizado.\n\nUna vez que completes este proyecto, deberías comprender cómo crear tu propia acción de contenedor Docker y probarla en un flujo de trabajo.\n\nLos ejecutores autohospedados deben usar un sistema operativo Linux y tener Docker instalado para ejecutar acciones de contenedor de Docker. Para más información sobre los requisitos de los ejecutores autohospedados, consulta [Referencia de ejecutores autohospedados](/es/actions/reference/runners/self-hosted-runners#requirements-for-self-hosted-runner-machines).\n\n> \\[!WARNING]\n> Al crear flujos de trabajo y acciones, siempre debe considerar si su código podría ejecutar entradas no confiables procedentes de posibles atacantes. Se tratará a algunos contextos como una entrada no confiable, ya que un atacante podrían insertar su propio contenido malintencionado. Para más información, consulta [Referencia de uso seguro](/es/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks).\n\n## Requisitos previos\n\n* Debe crear un repositorio en GitHub y clonarlo en la estación de trabajo. Para más información, consulta [Crear un repositorio nuevo](/es/repositories/creating-and-managing-repositories/creating-a-new-repository) y [Clonar un repositorio](/es/repositories/creating-and-managing-repositories/cloning-a-repository).\n* Si el repositorio usa Git LFS, debe incluir los objetos en los archivos del repositorio. Para más información, consulta [Administrar los objetos de LFS de Git en los archivos de tu repositorio](/es/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-git-lfs-objects-in-archives-of-your-repository).\n* Puede resultarle útil tener una comprensión básica de GitHub Actions, las variables de entorno y el sistema de archivos del contenedor Docker. Para más información, consulta [Almacenamiento de información en variables](/es/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables) y [Referencia de ejecutores hospedados en GitHub](/es/actions/reference/runners/github-hosted-runners#docker-container-filesystem).\n\n## Crear un Dockerfile\n\nEn el nuevo directorio `hello-world-docker-action`, cree un archivo `Dockerfile`. Asegúrese de que en el nombre de archivo se usen las mayúsculas adecuadas (una `D` mayúscula pero no una `f` mayúscula) en caso de que tenga problemas. Para más información, consulta [Soporte de Dockerfile para Acciones de GitHub](/es/actions/reference/workflows-and-actions/dockerfile-support).\n\n**Dockerfile**\n\n```dockerfile copy\n# Container image that runs your code\nFROM alpine:3.10\n\n# Copies your code file from your action repository to the filesystem path `/` of the container\nCOPY entrypoint.sh /entrypoint.sh\n\n# Code file to execute when the docker container starts up (`entrypoint.sh`)\nENTRYPOINT [\"/entrypoint.sh\"]\n```\n\n## Crear un archivo de metadatos de una acción\n\nCree un archivo `action.yml` en el directorio `hello-world-docker-action` que ha creado antes. Para más información, consulta [Guía de referencia de la sintaxis de metadatos](/es/actions/reference/workflows-and-actions/metadata-syntax).\n\n**action.yml**\n\n```yaml copy\n# action.yml\nname: 'Hello World'\ndescription: 'Greet someone and record the time'\ninputs:\n  who-to-greet:  # id of input\n    description: 'Who to greet'\n    required: true\n    default: 'World'\noutputs:\n  time: # id of output\n    description: 'The time we greeted you'\nruns:\n  using: 'docker'\n  image: 'Dockerfile'\n  args:\n    - ${{ inputs.who-to-greet }}\n```\n\nEstos metadatos definen un parámetro de entrada `who-to-greet` y uno de salida `time`. Para pasar entradas al contenedor de Docker, debe declarar la entrada mediante `inputs` y pasarla en la palabra clave `args`. Todo lo que incluya en `args` se pasa al contenedor, pero para que a los usuarios les resulte más sencillo descubrir la acción, se recomienda usar campos de entrada.\n\nGitHub creará una imagen a partir de `Dockerfile` y ejecutará comandos en un nuevo contenedor usando esta imagen.\n\n## Escribir el código de la acción\n\nPuedes elegir cualquier imagen de Docker base y, por lo tanto, cualquier idioma para tu acción. En el ejemplo de script del shell siguiente se usa la variable de entrada `who-to-greet` para imprimir \"Hello \\[a\\_quien\\_se\\_salude]\" en el archivo de registro.\n\nA continuación, el script obtiene la hora actual y la establece como una variable de salida que pueden usar las acciones que se ejecutan posteriormente en un trabajo. Para que GitHub reconozca variables de salida, debe escribirlas en el archivo de `$GITHUB_OUTPUT` entorno: `echo \"<output name>=<value>\" >> $GITHUB_OUTPUT`. Para más información, consulta [Comandos de flujo de trabajo para Acciones de GitHub](/es/actions/reference/workflows-and-actions/workflow-commands#setting-an-output-parameter).\n\n1. Cree un nuevo archivo `entrypoint.sh` en el directorio `hello-world-docker-action`.\n\n2. Agregue el código siguiente al archivo `entrypoint.sh`.\n\n**entrypoint.sh**\n\n```shell copy\n#!/bin/sh -l\n\necho \"Hello $1\"\ntime=$(date)\necho \"time=$time\" >> $GITHUB_OUTPUT\n\n```\n\nSi `entrypoint.sh` se ejecuta sin errores, el estado de la acción se establece en `success`. También puedes establecer explícitamente códigos de salida en el código de tu acción para proporcionar el estado de una acción. Para más información, consulta [Establecimiento de códigos de salida para acciones](/es/actions/how-tos/create-and-publish-actions/set-exit-codes).\n\n1. Convierte el archivo `entrypoint.sh` en ejecutable. Git proporciona una manera de cambiar explícitamente el modo de permiso de un archivo para que no se restablezca cada vez que haya una bifurcación o clonación.\n\n   ```shell copy\n   git add entrypoint.sh\n   git update-index --chmod=+x entrypoint.sh\n   ```\n\n2. Opcionalmente, para comprobar el modo de permiso del archivo en el índice de Git, ejecute el siguiente comando.\n\n   ```shell copy\n   git ls-files --stage entrypoint.sh\n   ```\n\n   Una salida como `100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       entrypoint.sh` significa que el archivo tiene el permiso ejecutable. En este ejemplo, `755` indica el permiso ejecutable.\n\n## Crear un README\n\nPuedes crear un archivo README para que las personas sepan cómo usar tu acción. Un archivo README resulta más útil cuando planificas el intercambio de tu acción públicamente, pero también es una gran manera de recordarle a tu equipo cómo usar la acción.\n\nEn el directorio `hello-world-docker-action`, cree un archivo `README.md` que especifique la información siguiente:\n\n* Una descripción detallada de lo que hace la acción.\n* Los argumentos de entrada y salida obligatorios.\n* Los argumentos de entrada y salida opcionales.\n* Los secretos que usa la acción.\n* Las variables de entorno que usa la acción.\n* Un ejemplo de cómo usar la acción en un flujo de trabajo.\n\n**README.md**\n\n```markdown copy\n# Hello world docker action\n\nThis action prints \"Hello World\" or \"Hello\" + the name of a person to greet to the log.\n\n## Inputs\n\n## `who-to-greet`\n\n**Required** The name of the person to greet. Default `\"World\"`.\n\n## Outputs\n\n## `time`\n\nThe time we greeted you.\n\n## Example usage\n\nuses: actions/hello-world-docker-action@v2\nwith:\n  who-to-greet: 'Mona the Octocat'\n```\n\n## Confirmación, etiquetado e inserción de una acción\n\nDesde el terminal, confirme los archivos `action.yml`, `entrypoint.sh`, `Dockerfile` y `README.md`.\n\nTambién es recomendable agregar una etiqueta de versión para los lanzamientos de tu acción. Para más información sobre el control de versiones de la acción, consulta [Administración de acciones personalizadas](/es/actions/how-tos/create-and-publish-actions/manage-custom-actions#using-release-management-for-actions).\n\n```shell copy\ngit add action.yml entrypoint.sh Dockerfile README.md\ngit commit -m \"My first action is ready\"\ngit tag -a -m \"My first action release\" v1\ngit push --follow-tags\n```\n\n## Probar tu acción en un flujo de trabajo\n\nAhora estás listo para probar tu acción en un flujo de trabajo.\n\n* Cuando una acción está en un repositorio privado, puedes controlar quién puede acceder a ella. Para más información, consulta [Administración de la configuración de Acciones de GitHub para un repositorio](/es/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#allowing-access-to-components-in-a-private-repository).\n* Cuando una acción se encuentra en un repositorio interno, la acción solo se puede usar en flujos de trabajo del mismo repositorio.\n* Los flujos de trabajo de cualquier repositorio pueden usar acciones públicas.\n\n### Ejemplo usando una acción pública\n\nEn el código de flujo de trabajo siguiente se usa la acción *hello world* completada en el repositorio público [`actions/hello-world-docker-action`](https://github.com/actions/hello-world-docker-action). Copie el código de ejemplo de flujo de trabajo siguiente en un archivo `.github/workflows/main.yml`, pero reemplace `actions/hello-world-docker-action` por el repositorio y el nombre de la acción. También puede reemplazar la entrada `who-to-greet` por su nombre.\nLas acciones públicas se pueden usar aunque no se publiquen en GitHub Marketplace. Para más información, consulta [Publicar acciones en GitHub Marketplace](/es/actions/how-tos/create-and-publish-actions/publish-in-github-marketplace#publishing-an-action).\n\n**.github/workflows/main.yml**\n\n```yaml copy\non: [push]\n\njobs:\n  hello_world_job:\n    runs-on: ubuntu-latest\n    name: A job to say hello\n    steps:\n      - name: Hello world action step\n        id: hello\n        uses: actions/hello-world-docker-action@v2\n        with:\n          who-to-greet: 'Mona the Octocat'\n      # Use the output from the `hello` step\n      - name: Get the output time\n        run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n```\n\n### Ejemplo usando una acción privada\n\nCopie el código de flujo de trabajo de ejemplo siguiente en un archivo `.github/workflows/main.yml` del repositorio de la acción. También puede reemplazar la entrada `who-to-greet` por su nombre.\nEsta acción privada no se puede publicar en GitHub Marketplace y solo puede usarse en este repositorio.\n\n**.github/workflows/main.yml**\n\n```yaml copy\non: [push]\n\njobs:\n  hello_world_job:\n    runs-on: ubuntu-latest\n    name: A job to say hello\n    steps:\n      # To use this repository's private action,\n      # you must check out the repository\n      - name: Checkout\n        uses: actions/checkout@v6\n      - name: Hello world action step\n        uses: ./ # Uses an action in the root directory\n        id: hello\n        with:\n          who-to-greet: 'Mona the Octocat'\n      # Use the output from the `hello` step\n      - name: Get the output time\n        run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n```\n\nEn el repositorio, haga clic en la pestaña **Actions** y seleccione la última ejecución de flujo de trabajo. En **Jobs** o en el gráfico de visualización, haga clic en **A job to say hello**.\n\nEn el registro, debería ver el **paso de acción Hola mundo** y debería ver \"Hello Mona the Octocat\", o el nombre que haya usado para la entrada `who-to-greet` impreso en el registro. Para ver la marca de tiempo, haz clic en **Obtener la hora de salida**.\n\n## Acceso a los archivos creados por una acción de contenedor\n\nCuando se ejecuta una acción de contenedor, asignará automáticamente el directorio de trabajo predeterminado (`GITHUB_WORKSPACE`) en el ejecutor con el directorio `/github/workspace` del contenedor. Los archivos agregados a este directorio en el contenedor estarán disponibles para los pasos posteriores del mismo trabajo. Por ejemplo, si tiene una acción de contenedor que compila el proyecto y desea cargar la salida de compilación como un artefacto, puede seguir estos pasos.\n\n**workflow\\.yml**\n\n```yaml copy\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n\n      # Output build artifacts to /github/workspace on the container.\n      - name: Containerized Build\n        uses: ./.github/actions/my-container-action\n\n      - name: Upload Build Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: workspace_artifacts\n          path: ${{ github.workspace }}\n```\n\nPara obtener más información sobre cómo cargar la salida de compilación como un artefacto, consulta [Almacenamiento y uso compartido de datos con artefactos de flujo de trabajo](/es/actions/tutorials/store-and-share-data).\n\n## Acciones de contenedor de Docker de ejemplo en GitHub.com\n\nPuede encontrar muchos ejemplos de acciones de contenedor de Docker en GitHub.com.\n\n* [github/issue-metrics](https://github.com/github/issue-metrics)\n* [microsoft/infersharpaction](https://github.com/microsoft/infersharpaction)\n* [microsoft/ps-docs](https://github.com/microsoft/ps-docs)"}