{"meta":{"title":"Criando uma ação de contêiner do Docker","intro":"Neste tutorial, você aprenderá a criar uma ação de contêiner do Docker.","product":"GitHub Actions","breadcrumbs":[{"href":"/pt/actions","title":"GitHub Actions"},{"href":"/pt/actions/tutorials","title":"Tutoriais"},{"href":"/pt/actions/tutorials/use-containerized-services","title":"Usar serviços em contêineres"},{"href":"/pt/actions/tutorials/use-containerized-services/create-a-docker-container-action","title":"Criar uma ação de contêiner do Docker"}],"documentType":"article"},"body":"# Criando uma ação de contêiner do Docker\n\nNeste tutorial, você aprenderá a criar uma ação de contêiner do Docker.\n\n## Introdução\n\nNeste guia, você aprenderá os componentes básicos necessários para criar e usar uma ação do contêiner Docker empacotado. Para manter o foco deste guia nos componentes necessários para empacotar a ação, a funcionalidade do código da ação é mínima. A ação imprime \"Olá, mundo\" nos registros ou \"Olá, \\[who-to-greet]\", se você fornecer um nome personalizado.\n\nAo terminar esse projeto, você entenderá como criar sua própria ação de contêiner Docker e poderá testá-la em um fluxo de trabalho.\n\nExecutores auto-hospedados devem usar um sistema operacional Linux e ter o Docker instalado para executar as ações do contêiner Docker. Para obter mais informações sobre os requisitos dos executores auto-hospedados, confira [Executores auto-hospedados](/pt/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#requirements-for-self-hosted-runner-machines).\n\n> \\[!WARNING]\n> Ao criar fluxos de trabalho e ações, sempre considere se o código poderá executar entradas não confiáveis de possíveis invasores. Certos contextos devem ser tratados como entradas não confiáveis, uma vez que um invasor pode inserir seu próprio conteúdo malicioso. Para saber mais, confira [Referência de uso seguro](/pt/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections).\n\n## Pré-requisitos\n\n* Crie um repositório em GitHub e clone-o em sua estação de trabalho. Para saber mais, confira [Criar um repositório](/pt/repositories/creating-and-managing-repositories/creating-a-new-repository) e [Clonar um repositório](/pt/repositories/creating-and-managing-repositories/cloning-a-repository).\n* Se seu repositório usar o Git LFS, você deverá incluir os objetos nos arquivos de seu repositório. Para saber mais, confira [Gerenciando objetos LFS do Git em arquivos do seu repositório](/pt/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-git-lfs-objects-in-archives-of-your-repository).\n* Pode ser útil ter um entendimento básico das variáveis do ambiente GitHub Actions e do sistema de arquivo do contêiner Docker. Para saber mais, confira [Armazenar informações em variáveis](/pt/actions/learn-github-actions/variables) e [Executores hospedados no GitHub](/pt/enterprise-cloud@latest/actions/using-github-hosted-runners/about-github-hosted-runners#docker-container-filesystem).\n\n## Criação de um Dockerfile\n\nNo diretório `hello-world-docker-action`, crie um arquivo `Dockerfile`. Verifique se o seu nome de arquivo está em maiúsculas corretamente (use um `D` maiúsculo, mas não um `f` maiúsculo) se estiver tendo problemas. Para saber mais, confira [Suporte do Dockerfile para GitHub Actions](/pt/actions/creating-actions/dockerfile-support-for-github-actions).\n\n```\n          **Dockerfile**\n```\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## Criar um arquivo de metadados de ação\n\nCrie um arquivo `action.yml` no diretório `hello-world-docker-action` que você criou acima. Para saber mais, confira [Referência de sintaxe de metadados](/pt/actions/creating-actions/metadata-syntax-for-github-actions).\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\nEsses metadados definem um parâmetro de entrada `who-to-greet` e um de saída `time`. Para transmitir entradas para o contêiner do Docker, você deve declarar a entrada usando `inputs` e transmitir a entrada na palavra-chave `args`. Tudo o que você inclui em `args` é transmitido para o contêiner, mas para ter uma melhor capacidade de descoberta para os usuários da sua ação, recomendamos o uso de entradas.\n\nO GitHub criará uma imagem com base no `Dockerfile` e executará comandos em um novo contêiner usando essa imagem.\n\n## Gravar um código de ação\n\nVocê pode escolher qualquer imagem Docker de base e, portanto, qualquer linguagem para sua ação. O exemplo de script de shell a seguir usa a variável de entrada `who-to-greet` para imprimir \"Olá, \\[quem cumprimentar]\" no arquivo de log.\n\nNa sequência, o script obtém a hora atual e a configura como uma variável de saída que pode ser usada pelas ações executadas posteriormente em um trabalho. Para que o GitHub reconheça variáveis de saída, você deve gravá-las no arquivo de ambiente `$GITHUB_OUTPUT`: `echo \"<output name>=<value>\" >> $GITHUB_OUTPUT`. Para saber mais, confira [Comandos de fluxo de trabalho para o GitHub Actions](/pt/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter).\n\n1. Crie um arquivo `entrypoint.sh` no diretório `hello-world-docker-action`.\n\n2. Adicione o código a seguir ao arquivo `entrypoint.sh`.\n\n   ```\n          **entrypoint.sh**\n   ```\n\n   ```shell copy\n   #!/bin/sh -l\n\n   echo \"Hello $1\"\n   time=$(date)\n   echo \"time=$time\" >> $GITHUB_OUTPUT\n\n   ```\n\n   Se `entrypoint.sh` for executado sem erros, o status da ação será definido como `success`. Você também pode definir explicitamente códigos de saída no código de ação para fornecer o status de uma ação. Para saber mais, confira [Definindo códigos de saída para ações](/pt/actions/creating-actions/setting-exit-codes-for-actions).\n\n3. Torne o arquivo `entrypoint.sh` executável. O Git fornece uma maneira de alterar explicitamente o modo de permissão de um arquivo para que ele não seja redefinido toda vez que houver um clone/fork.\n\n   ```shell copy\n   git add entrypoint.sh\n   git update-index --chmod=+x entrypoint.sh\n   ```\n\n4. Opcionalmente, para verificar o modo de permissão do arquivo no índice Git, execute o comando a seguir.\n\n   ```shell copy\n   git ls-files --stage entrypoint.sh\n   ```\n\n   Uma saída como `100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       entrypoint.sh` significa que o arquivo tem a permissão executável. Neste exemplo, `755` denota a permissão executável.\n\n## Criando um README\n\nPara que as pessoas saibam como usar sua ação, você pode criar um arquivo README. Um arquivo README é útil quando você planeja compartilhar publicamente sua ação, mas também é uma ótima maneira de lembrá-lo ou sua equipe sobre como usar a ação.\n\nNo diretório `hello-world-docker-action`, crie um arquivo `README.md` que especifica as seguintes informações:\n\n* Uma descrição detalhada do que a ação faz.\n* Argumentos de entrada e saída obrigatórios.\n* Argumentos de entrada e saída opcionais.\n* Segredos que a ação usa.\n* Variáveis de ambiente que a ação usa.\n* Um exemplo de como usar sua ação em um fluxo de trabalho.\n\n  ```\n          **LEIAME.md**\n  ```\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## Faça commit, tag e push da sua ação\n\nPelo terminal, faça commit dos arquivos `action.yml`, `entrypoint.sh`, `Dockerfile` e `README.md`.\n\nAdicionar uma tag da versão para versões da sua ação é considerada uma prática recomendada. Para obter mais informações sobre o controle de versão da ação, confira [Sobre ações personalizadas](/pt/actions/creating-actions/about-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## Testar sua ação em um fluxo de trabalho\n\nAgora você está pronto para testar sua ação em um fluxo de trabalho.\n\n* Quando uma ação está em um repositório privado, é possível controlar quem tem acesso a ela. Para saber mais, confira [Gerenciando configurações de GitHub Actions para um repositório](/pt/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* Quando uma ação está em um repositório interno, ela só pode ser usada em fluxos de trabalho no mesmo repositório.\n* As ações públicas podem ser usadas por fluxos de trabalho em qualquer repositório.\n\n### Exemplo usando uma ação pública\n\nO código de fluxo de trabalho a seguir usa a ação *hello world* concluída no repositório público [`actions/hello-world-docker-action`](https://github.com/actions/hello-world-docker-action). Copie o código de exemplo de fluxo de trabalho a seguir em um arquivo `.github/workflows/main.yml`, mas substitua o `actions/hello-world-docker-action` pelo nome do repositório e da ação. Você também pode substituir a entrada `who-to-greet` pelo seu nome. As ações públicas podem ser usadas mesmo se não forem publicadas em GitHub Marketplace. Para saber mais, confira [Publicar ações no GitHub Marketplace](/pt/actions/creating-actions/publishing-actions-in-github-marketplace#publishing-an-action).\n\n```\n          **.github/workflows/main.yml**\n```\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### Exemplo usando uma ação privada\n\nCopie o código de exemplo de fluxo de trabalho a seguir para um arquivo `.github/workflows/main.yml` no repositório da ação. Você também pode substituir a entrada `who-to-greet` pelo seu nome. Esta ação privada não pode ser publicada em GitHub Marketplace, e só pode ser usada neste repositório.\n\n```\n          **.github/workflows/main.yml**\n```\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@v5\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\nNo repositório, clique na guia **Ações** e selecione a execução mais recente do fluxo de trabalho. Em **Trabalhos** ou no grafo de visualização, clique em **Um trabalho para dizer olá**.\n\nClique em **Etapa da ação Olá, mundo** e você verá \"Olá, Mona, o Octocat\" ou o nome usado para a entrada `who-to-greet` impresso no log. Para ver o carimbo de data/hora, clique em **Obter a hora da saída**.\n\n## Acessar arquivos criados por uma ação de contêiner\n\nQuando uma ação de contêiner é executada, ela mapeia automaticamente o diretório de trabalho padrão (`GITHUB_WORKSPACE`) no executor com o diretório `/github/workspace` no contêiner. Todos os arquivos adicionados a esse diretório no contêiner estarão disponíveis para todas as etapas subsequentes no mesmo trabalho. Por exemplo, se você tiver uma ação de contêiner que compila seu projeto e quiser carregar a saída da compilação como um artefato, poderá usar as etapas a seguir.\n\n```\n          **workflow.yml**\n```\n\n```yaml copy\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v5\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 obter mais informações sobre como carregar a saída de compilação como um artefato, consulte [Armazenar e compartilhar dados com artefatos de fluxo de trabalho](/pt/actions/using-workflows/storing-workflow-data-as-artifacts).\n\n## Exemplos de ações de contêiner do Docker no GitHub.com\n\nEncontre muitos exemplos de ações de contêiner do Docker no 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)"}