O erro “php_network_getaddresses: getaddrinfo for redis failed: Temporary failure in name resolution” é um problema comum ao usar Redis com Docker, especialmente em ambientes como o Laradock. Ele indica que o PHP não consegue resolver o nome do host do Redis, ou seja, não consegue encontrar o servidor Redis na rede. Este artigo descreverá as causas comuns e as soluções passo a passo para resolver esse problema.

Causas Comuns:

  • Nome do host incorreto: O nome do serviço Redis configurado na sua aplicação não corresponde ao nome do container Redis na sua rede Docker.
  • Problemas de DNS dentro do Docker: O container PHP não consegue resolver nomes de host dentro da rede Docker.
  • Container Redis não está em execução: O serviço Redis pode não estar em execução ou não ter sido iniciado corretamente.
  • Problemas de rede do Docker: Configurações incorretas de rede no Docker podem impedir a comunicação entre os containers.
  • Arquivo de dump do Redis corrompido (dump.rdb): Um arquivo de persistência do Redis corrompido pode impedir a inicialização do servidor.

Soluções Passo a Passo:

  1. Verifique os logs do container Redis:

    Esta é geralmente a primeira etapa de diagnóstico, pois os logs fornecem informações sobre a causa de uma falha.

    • No Laradock:

      docker-compose logs redis
      
    • Em outras configurações Docker:

      docker logs <nome_do_container_redis>
      

    Procure por erros como:

    • Can't open the log file
    • Bad file format reading the append only file
    • Failed opening the RDB file

    Se você encontrar mensagens relacionadas a “RDB file” ou “AOF file” corrompidos, a solução 2 abaixo pode resolver o problema.

  2. Exclua o arquivo de dump do Redis (dump.rdb) se estiver corrompido:

    Se os logs indicarem um problema com o arquivo dump.rdb (arquivo de persistência do Redis), excluí-lo pode resolver o problema. Atenção: Isso resultará na perda de dados persistidos no Redis. Se a persistência for crucial, tente outras soluções primeiro ou faça um backup do arquivo antes de excluí-lo.

    • No Laradock:

      docker-compose exec redis bash
      rm /data/dump.rdb
      exit
      docker-compose restart redis
      

      Ou, se você tem um volume mapeado:

      Localize o volume mapeado para /data do container redis no seu docker-compose.yml. No host, remova o arquivo dump.rdb dentro desse diretório. Em seguida, reinicie o container redis.

    • Em outras configurações Docker:

      Localize o diretório onde o Redis armazena os dados (geralmente configurado em redis.conf ou no docker-compose.yml usando volumes). Remova o arquivo dump.rdb desse diretório e reinicie o container Redis.

  3. Verifique o nome do host do Redis:

    • No Laradock: O nome padrão do serviço Redis no Laradock é redis. Certifique-se de que sua configuração de conexão Redis (geralmente em .env ou config/database.php no Laravel) esteja usando este nome. Exemplo:

      REDIS_HOST=redis
      REDIS_PORT=6379
      
    • Em outras configurações Docker: Se você não estiver usando o Laradock, verifique o nome do serviço definido no seu arquivo docker-compose.yml.

  4. Reinicie os containers Docker:

    Uma simples reinicialização pode resolver problemas temporários de resolução de nomes. No Laradock, execute:

    docker-compose down
    docker-compose up -d redis workspace nginx
    

    Certifique-se de iniciar o redis, o workspace (que contém o PHP) e o nginx (se estiver usando).

  5. Verifique a resolução de nomes dentro do container PHP:

    Acesse o container workspace do Laradock:

    docker-compose exec workspace bash
    

    Dentro do container, tente executar o comando ping redis:

    ping redis
    
    • Se o ping falhar, isso indica um problema de resolução de nomes dentro do container. Continue para o próximo passo.
    • Se o ping funcionar, o problema pode estar em outro lugar, como na configuração da sua aplicação.
  6. Reconstrua a rede Docker (em casos mais complexos):

    Em alguns casos, a rede Docker pode ficar em um estado inconsistente. Tente reconstruí-la:

    docker-compose down
    docker network prune
    docker-compose up -d redis workspace nginx
    

    O comando docker network prune remove redes não utilizadas, o que pode ajudar a resolver problemas de configuração.

  7. Verifique a configuração do docker-compose.yml (para configurações personalizadas):

    Se você não estiver usando o Laradock e tiver uma configuração personalizada do docker-compose.yml, certifique-se de que os containers estejam na mesma rede. Veja um exemplo:

    version: "3.7"
    services:
      web:
        image: nginx:alpine
        ports:
          - "80:80"
        networks:
          - my-network
      redis:
        image: redis:alpine
        networks:
          - my-network
    networks:
      my-network:
        driver: bridge
    

    Neste exemplo, ambos os serviços (web e redis) estão na mesma rede chamada my-network.

  8. Verifique o arquivo hosts do container (menos comum):

    Em casos raros, o arquivo /etc/hosts dentro do container PHP pode estar incorreto. Você pode verificar e, se necessário, adicionar uma entrada manualmente. No entanto, as soluções anteriores geralmente resolvem o problema antes que isso seja necessário.

Exemplo de solução no Laradock (resumo):

  1. docker-compose logs redis (Verificar logs)
  2. (Se necessário, com base nos logs):
    docker-compose exec redis bash
    rm /data/dump.rdb
    exit
    docker-compose restart redis
    
  3. Verifique .env: REDIS_HOST=redis
  4. docker-compose down
  5. docker-compose up -d redis workspace nginx

Seguindo esses passos, você deverá conseguir resolver o erro “php_network_getaddresses: getaddrinfo for redis failed: Temporary failure in name resolution” e conectar sua aplicação ao Redis corretamente dentro do seu ambiente Docker. Se o problema persistir, forneça mais detalhes sobre sua configuração para que possamos ajudar melhor.