{"meta":{"title":"Criando contêineres de serviço Redis","intro":"Você pode usar os contêineres de serviço para criar um cliente Redis no seu fluxo de trabalho. Este guia mostra exemplos de criação de serviço Redis para trabalhos executados em contêineres ou diretamente na máquina executora.","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-redis-service-containers","title":"Criar contêineres de serviço Redis"}],"documentType":"article"},"body":"# Criando contêineres de serviço Redis\n\nVocê pode usar os contêineres de serviço para criar um cliente Redis no seu fluxo de trabalho. Este guia mostra exemplos de criação de serviço Redis para trabalhos executados em contêineres ou diretamente na máquina executora.\n\n## Introdução\n\nEste guia mostra exemplos de fluxo de trabalho que configuram um contêiner de serviço usando a imagem Docker Hub `redis`. O fluxo de trabalho executa um script para criar um cliente Redis e preencher os dados do cliente. Para testar se o fluxo de trabalho cria e preenche o cliente Redis, o script imprime os dados do cliente no console.\n\n> \\[!NOTE]\n> Se os fluxos de trabalho usarem ações de contêiner do Docker, contêineres de trabalho ou contêineres de serviço, você precisará usar um executor do Linux:\n>\n> * Se você estiver usando executores hospedados em GitHub, você deverá usar um executor do Ubuntu.\n> * Se você estiver usando executores auto-hospedados, você deve usar uma máquina Linux, pois seu executor e o Docker precisam ser instalados.\n\n## Pré-requisitos\n\nVocê deve estar familiarizado com como os contêineres de serviço funcionam com GitHub Actions e as diferenças de rede entre trabalhos em execução diretamente no executor ou em um contêiner. Para saber mais, confira [Comunicar-se com os contêineres de serviço do Docker](/pt/actions/using-containerized-services/about-service-containers).\n\nTambém pode ser útil ter um entendimento básico de YAML, a sintaxe para GitHub Actions e Redis. Para saber mais, veja:\n\n* [Escrevendo fluxos de trabalho](/pt/actions/learn-github-actions)\n* [Introdução ao Redis](https://redis.io/learn/howtos/quick-start) na documentação do Redis\n\n## Executar trabalhos em contêineres\n\nA configuração de tarefas a serem executadas em um contêiner simplifica as configurações de rede entre o trabalho e os contêineres do serviço. Docker contêineres na mesma rede de ponte definida pelo usuário expõe todas as portas umas para as outras, então você não precisa mapear nenhuma das portas de contêiner de serviço para o host Docker. Você pode acessar o contêiner de serviço do contêiner de trabalho usando a etiqueta que você configurar no fluxo de trabalho.\n\nVocê pode copiar esse arquivo de fluxo de trabalho para o diretório `.github/workflows` do repositório e modificá-lo conforme necessário.\n\n```yaml copy\nname: Redis container example\non: push\n\njobs:\n  # Label of the container job\n  container-job:\n    # Containers must run in Linux based operating systems\n    runs-on: ubuntu-latest\n    # Docker Hub image that `container-job` executes in\n    container: node:20-bookworm-slim\n\n    # Service containers to run with `container-job`\n    services:\n      # Label used to access the service container\n      redis:\n        # Docker Hub image\n        image: redis\n        # Set health checks to wait until redis has started\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n\n    steps:\n      # Downloads a copy of the code in your repository before running CI tests\n      - name: Check out repository code\n        uses: actions/checkout@v6\n\n      # Performs a clean installation of all dependencies in the `package.json` file\n      # For more information, see https://docs.npmjs.com/cli/ci.html\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Connect to Redis\n        # Runs a script that creates a Redis client, populates\n        # the client with data, and retrieves data\n        run: node client.js\n        # Environment variable used by the `client.js` script to create a new Redis client.\n        env:\n          # The hostname used to communicate with the Redis service container\n          REDIS_HOST: redis\n          # The default Redis port\n          REDIS_PORT: 6379\n```\n\n### Configuração da tarefa do contêiner\n\nEste fluxo de trabalho configura uma tarefa que é executada no contêiner `node:20-bookworm-slim` e usa o executor do `ubuntu-latest`  hospedado no GitHub como host do Docker para o contêiner. Para obter mais informações sobre o contêiner `node:20-bookworm-slim`, confira a [imagem do nó](https://hub.docker.com/_/node) no Docker Hub.\n\nO fluxo de trabalho configura um contêiner de serviço com o rótulo `redis`. Todos os serviços precisam ser executados em um contêiner, ou seja, cada serviço exige que você especifique o contêiner `image`. Este exemplo usa a imagem de contêiner `redis` e inclui opções de verificação de integridade para verificar se o serviço está funcionando. Acrescente uma marca ao nome da imagem para especificar uma versão, por exemplo `redis:6`. Para obter mais informações, confira a [imagem redis](https://hub.docker.com/_/redis) no Docker Hub.\n\n```yaml copy\njobs:\n  # Label of the container job\n  container-job:\n    # Containers must run in Linux based operating systems\n    runs-on: ubuntu-latest\n    # Docker Hub image that `container-job` executes in\n    container: node:20-bookworm-slim\n\n    # Service containers to run with `container-job`\n    services:\n      # Label used to access the service container\n      redis:\n        # Docker Hub image\n        image: redis\n        # Set health checks to wait until redis has started\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n```\n\n### Configurando as etapas para o trabalho de contêiner\n\nO fluxo de trabalho executa as seguintes etapas:\n\n1. Verifica o repositório no executor\n2. Instala dependências\n3. Executa um script para criar um cliente\n\n```yaml copy\nsteps:\n  # Downloads a copy of the code in your repository before running CI tests\n  - name: Check out repository code\n    uses: actions/checkout@v6\n\n  # Performs a clean installation of all dependencies in the `package.json` file\n  # For more information, see https://docs.npmjs.com/cli/ci.html\n  - name: Install dependencies\n    run: npm ci\n\n  - name: Connect to Redis\n    # Runs a script that creates a Redis client, populates\n    # the client with data, and retrieves data\n    run: node client.js\n    # Environment variable used by the `client.js` script to create a new Redis client.\n    env:\n      # The hostname used to communicate with the Redis service container\n      REDIS_HOST: redis\n      # The default Redis port\n      REDIS_PORT: 6379\n```\n\nO script *client.js* procura as variáveis de ambiente `REDIS_HOST` e `REDIS_PORT` para criar o cliente. O fluxo de trabalho define essas duas variáveis de ambiente como parte da etapa \"Conectar-se ao Redis\" para disponibilizá-las ao script *client.js*. Para obter mais informações sobre o script, confira [Como testar o contêiner do serviço do Redis](#testing-the-redis-service-container).\n\nO hostname do serviço Redis é o rótulo que você configurou no seu fluxo de trabalho, neste caso, `redis`. Uma vez que os contêineres do Docker na mesma rede da ponte definida pelo usuário abrem todas as portas por padrão, você poderá acessar o contêiner de serviço na porta-padrão 6379 do Redis.\n\n## Executar trabalhos diretamente na máquina executora\n\nAo executar um trabalho diretamente na máquina executora, você deverá mapear as portas no contêiner de serviço às portas do host Docker. Você pode acessar os contêineres de serviço do host do Docker usando o `localhost` e o número da porta do host do Docker.\n\nVocê pode copiar esse arquivo de fluxo de trabalho para o diretório `.github/workflows` do repositório e modificá-lo conforme necessário.\n\n```yaml copy\nname: Redis runner example\non: push\n\njobs:\n  # Label of the runner job\n  runner-job:\n    # You must use a Linux environment when using service containers or container jobs\n    runs-on: ubuntu-latest\n\n    # Service containers to run with `runner-job`\n    services:\n      # Label used to access the service container\n      redis:\n        # Docker Hub image\n        image: redis\n        # Set health checks to wait until redis has started\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          # Maps port 6379 on service container to the host\n          - 6379:6379\n\n    steps:\n      # Downloads a copy of the code in your repository before running CI tests\n      - name: Check out repository code\n        uses: actions/checkout@v6\n\n      # Performs a clean installation of all dependencies in the `package.json` file\n      # For more information, see https://docs.npmjs.com/cli/ci.html\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Connect to Redis\n        # Runs a script that creates a Redis client, populates\n        # the client with data, and retrieves data\n        run: node client.js\n        # Environment variable used by the `client.js` script to create\n        # a new Redis client.\n        env:\n          # The hostname used to communicate with the Redis service container\n          REDIS_HOST: localhost\n          # The default Redis port\n          REDIS_PORT: 6379\n```\n\n### Configurar o trabalho executor\n\nO exemplo usa o executor hospedado no `ubuntu-latest`  GitHub como o host do Docker.\n\nO fluxo de trabalho configura um contêiner de serviço com o rótulo `redis`. Todos os serviços precisam ser executados em um contêiner, ou seja, cada serviço exige que você especifique o contêiner `image`. Este exemplo usa a imagem de contêiner `redis` e inclui opções de verificação de integridade para verificar se o serviço está funcionando. Acrescente uma marca ao nome da imagem para especificar uma versão, por exemplo `redis:6`. Para obter mais informações, confira a [imagem redis](https://hub.docker.com/_/redis) no Docker Hub.\n\nO fluxo de trabalho mapeia a porta 6379 no contêiner de serviço do Redis para o host do Docker. Para saber mais sobre a palavra-chave `ports`, confira [Comunicar-se com os contêineres de serviço do Docker](/pt/actions/using-containerized-services/about-service-containers#mapping-docker-host-and-service-container-ports).\n\n```yaml copy\njobs:\n  # Label of the runner job\n  runner-job:\n    # You must use a Linux environment when using service containers or container jobs\n    runs-on: ubuntu-latest\n\n    # Service containers to run with `runner-job`\n    services:\n      # Label used to access the service container\n      redis:\n        # Docker Hub image\n        image: redis\n        # Set health checks to wait until redis has started\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          # Maps port 6379 on service container to the host\n          - 6379:6379\n```\n\n### Configurando as etapas para o trabalho do executor\n\nO fluxo de trabalho executa as seguintes etapas:\n\n1. Verifica o repositório no executor\n2. Instala dependências\n3. Executa um script para criar um cliente\n\n```yaml copy\nsteps:\n  # Downloads a copy of the code in your repository before running CI tests\n  - name: Check out repository code\n    uses: actions/checkout@v6\n\n  # Performs a clean installation of all dependencies in the `package.json` file\n  # For more information, see https://docs.npmjs.com/cli/ci.html\n  - name: Install dependencies\n    run: npm ci\n\n  - name: Connect to Redis\n    # Runs a script that creates a Redis client, populates\n    # the client with data, and retrieves data\n    run: node client.js\n    # Environment variable used by the `client.js` script to create\n    # a new Redis client.\n    env:\n      # The hostname used to communicate with the Redis service container\n      REDIS_HOST: localhost\n      # The default Redis port\n      REDIS_PORT: 6379\n```\n\nO script *client.js* procura as variáveis de ambiente `REDIS_HOST` e `REDIS_PORT` para criar o cliente. O fluxo de trabalho define essas duas variáveis de ambiente como parte da etapa \"Conectar-se ao Redis\" para disponibilizá-las ao script *client.js*. Para obter mais informações sobre o script, confira [Como testar o contêiner do serviço do Redis](#testing-the-redis-service-container).\n\nO nome do host é `localhost` ou `127.0.0.1`.\n\n## Testar o contêiner de serviço Redis\n\nVocê pode testar o seu pipeline usando o script a seguir, que cria um cliente Redis e preenche o cliente com alguns dados de exemplo. Em seguida, o script imprime no terminal os valores armazenados no cliente Redis. Seu script pode usar qualquer idioma desejado, mas este exemplo usa o Node.js e o módulo npm `redis`. Para obter mais informações, confira o [módulo npm redis](https://www.npmjs.com/package/redis).\n\nVocê pode modificar o *client.js* para incluir todas as operações do Redis necessárias para o fluxo de trabalho. Neste exemplo, o script cria a instância do cliente Redis, adiciona dados temporários e, em seguida, recupera os dados.\n\nAdicione um novo arquivo chamado *client.js* ao seu repositório com o seguinte código.\n\n```javascript copy\nconst redis = require(\"redis\");\n\n// Creates a new Redis client\n// If REDIS_HOST is not set, the default host is localhost\n// If REDIS_PORT is not set, the default port is 6379\nconst redisClient = redis.createClient({\n  url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`\n});\n\nredisClient.on(\"error\", (err) => console.log(\"Error\", err));\n\n(async () => {\n  await redisClient.connect();\n\n  // Sets the key \"octocat\" to a value of \"Mona the octocat\"\n  const setKeyReply = await redisClient.set(\"octocat\", \"Mona the Octocat\");\n  console.log(\"Reply: \" + setKeyReply);\n  // Sets a key to \"species\", field to \"octocat\", and \"value\" to \"Cat and Octopus\"\n  const SetFieldOctocatReply = await redisClient.hSet(\"species\", \"octocat\", \"Cat and Octopus\");\n  console.log(\"Reply: \" + SetFieldOctocatReply);\n  // Sets a key to \"species\", field to \"dinotocat\", and \"value\" to \"Dinosaur and Octopus\"\n  const SetFieldDinotocatReply = await redisClient.hSet(\"species\", \"dinotocat\", \"Dinosaur and Octopus\");\n  console.log(\"Reply: \" + SetFieldDinotocatReply);\n  // Sets a key to \"species\", field to \"robotocat\", and \"value\" to \"Cat and Robot\"\n  const SetFieldRobotocatReply = await redisClient.hSet(\"species\", \"robotocat\", \"Cat and Robot\");\n  console.log(\"Reply: \" + SetFieldRobotocatReply);\n\n  try {\n    // Gets all fields in \"species\" key\n    const replies = await redisClient.hKeys(\"species\");\n    console.log(replies.length + \" replies:\");\n    replies.forEach((reply, i) => {\n        console.log(\"    \" + i + \": \" + reply);\n    });\n    await redisClient.quit();\n  }\n  catch (err) {\n    // statements to handle any exceptions\n  }\n})();\n```\n\nO script cria um cliente do Redis usando o método `createClient`, que aceita um parâmetro `host` e `port`. O script usa as variáveis de ambiente `REDIS_HOST` e `REDIS_PORT` para definir o endereço IP e a porta do cliente. Se `host` e `port` não estiverem definidos, o host padrão será `localhost` e a porta padrão será 6379.\n\nO script usa os métodos `set` e `hset` para preencher o banco de dados com algumas chaves, campos e valores. Para confirmar se o cliente Redis contém os dados, o script imprime o conteúdo do banco de dados no registro do console.\n\nAo executar este fluxo de trabalho, você deve ver a saída a seguir na etapa \"Conectar-se ao Redis\", confirmando que você criou o cliente Redis e adicionou os dados:\n\n```shell\nReply: OK\nReply: 1\nReply: 1\nReply: 1\n3 replies:\n    0: octocat\n    1: dinotocat\n    2: robotocat\n```"}