DEV Community

jacksonPrimo
jacksonPrimo

Posted on • Edited on

Inicializando um projeto Ruby on Rails usando PostgreSql rodando em um container Docker

Primeiramente inicializamos o projeto.

$ rails new project_name --database=postgresql
Enter fullscreen mode Exit fullscreen mode

Em seguida configuramos o docker-compose.yml

version: '3.8'
services:
  database:
    container_name: project_name
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root
      POSTGRES_DB: project_name_development
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  adminer:
    container_name: adminer
    image: adminer
    restart: always
    ports:
      - "8080:8080"

Enter fullscreen mode Exit fullscreen mode

ps: Eu particularmente gosto de usar o adminer para visualizar as tabelas do banco, então essa imagem é opcional, para acessar ele basta entrar no endereço: localhost:8080, e colocar as credenciais:
sistem: PostgreSql
host: database
user: root
password: root

Em seguida configuramos o arquivo de configuração do banco de dados para o ambiente de desenvolvimento.

# config/database.yml
development:
  <<: *default
  host: localhost
  database: project_name_development
  username: root
  password: root
  port: 5432

Enter fullscreen mode Exit fullscreen mode

Para testarmos basta criarmos um novo model e uma migration.

$ rails g model User email: string
Enter fullscreen mode Exit fullscreen mode

E por fim rodar a migration que vai persistir as mudanças no banco.

$ rails db:migrate
Enter fullscreen mode Exit fullscreen mode

problemas na conexão do postgres caso o projeto esteja rodando no wsl

Atualmente é possível instalar o docker no windows e o wsl se comunicar com os containers dele, no entanto isso pode causar alguns problemas quando uma aplicação rodando dentro do wsl tenta se comunicar com um banco rodando em um container docker dentro do windows. Existem algumas saídas para este tipo de caso.

Primeiro passo

Uma das primeiras coisas a serem feitas é trocar o host da string de conexão por host.docker.internal, pois o localhost do linux dentro do wsl reflete apenas a propria rede e não a do windows que é onde está rodando o container do docker.

host.docker.internal busca o ip correto do container dentro do windows(no caso do wsl é o ip do proprio windows)

Segundo passo

permitir que o wsl abra uma conexão para o windows criando uma regra no firewall:

Você precisa permitir explicitamente que aplicações (como o WSL) se conectem à porta 5432 no seu computador.

  1. Abra o Firewall do Windows:
    • Pressione a tecla Windows, digite "Firewall" e selecione "Windows Defender Firewall com Segurança Avançada".
  2. Crie uma Nova Regra de Entrada:
    • No painel esquerdo, clique em "Regras de Entrada".
    • No painel direito, clique em "Nova Regra...".
  3. Configure a Regra:
    • Tipo de Regra: Selecione "Porta" e clique em "Avançar".
    • Protocolo e Portas: Selecione "TCP" e em "Portas locais específicas", digite 5432. Clique em "Avançar".
    • Ação: Selecione "Permitir a conexão" e clique em "Avançar".
    • Perfil: Deixe as três opções marcadas (Domínio, Particular, Público) para garantir que funcione em qualquer rede. Clique em "Avançar".
    • Nome: Dê um nome fácil de lembrar, como Docker Postgres WSL, e uma descrição se quiser. Clique em "Concluir".

Top comments (0)