Skip to content

Instantly share code, notes, and snippets.

@rafaelfnaves
Last active January 29, 2026 20:45
Show Gist options
  • Select an option

  • Save rafaelfnaves/41652c8f318c8cf17a3aa74408cafbed to your computer and use it in GitHub Desktop.

Select an option

Save rafaelfnaves/41652c8f318c8cf17a3aa74408cafbed to your computer and use it in GitHub Desktop.
Start new project rails with docker (development)

🚀 Boilerplate: Rails 8 + Docker (Guia Definitivo)

Este guia documenta o processo para iniciar um projeto Rails moderno utilizando containers, garantindo sincronia de permissões entre o host e o container, e resolvendo gargalos comuns de monitoramento de arquivos (Watchman).


📋 Pré-requisitos

  • Docker e Docker Compose instalados.
  • Conhecimento básico de terminal.

1. Preparação de Permissões

Crie a pasta do projeto e configure as variáveis de ambiente para que o Docker saiba quem é o seu usuário local.

mkdir meu-app-rails && cd meu-app-rails
touch .env

No arquivo .env, adicione seu UID e GID (descubra-os rodando id -u e id -g no terminal):

UID=1000
GID=1000

2. Arquivos de Configuração Iniciais

Dockerfile

Focado em desenvolvimento estável (Debian Slim).

FROM ruby:4.0.1-slim

# Instala dependências do sistema
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y \
    build-essential libpq-dev postgresql-client git pkg-config libvips curl libyaml-dev

# Sincronização de Usuário (Evita problemas de permissão/root)
ARG USER_ID=1000
ARG GROUP_ID=1000
RUN groupadd -g $GROUP_ID rails && \
    useradd -u $USER_ID -g rails -m -s /bin/bash rails

# Setup do ambiente de Gems
ENV BUNDLE_PATH=/usr/local/bundle \
    BUNDLE_BIN=/usr/local/bundle/bin \
    PATH=/usr/local/bundle/bin:$PATH
RUN mkdir -p /usr/local/bundle && chown -R rails:rails /usr/local/bundle

WORKDIR /app
RUN gem install foreman
USER rails

COPY --chown=rails:rails Gemfile Gemfile.lock ./
RUN bundle install

COPY --chown=rails:rails . .
EXPOSE 3000
CMD ["bash", "-c", "rm -f tmp/pids/server.pid && ./bin/dev"]

docker-compose.yml

Configuração com portas alternativas para evitar conflitos locais.

services:
  db:
    image: postgres:18-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5431:5432"
    environment:
      POSTGRES_USER: user_docker
      POSTGRES_PASSWORD: password_docker
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 5

  web:
    build:
      context: .
      args:
        - USER_ID=${UID:-1000}
        - GROUP_ID=${GID:-1000}
    command: bash -c "rm -f tmp/pids/server.pid && ./bin/dev"
    volumes:
      - .:/app
    ports:
      - "3001:3000"
    tty: true
    stdin_open: true
    environment:
      - DATABASE_HOST=db
      - DATABASE_USER=user_docker
      - DATABASE_PASSWORD=password_docker
      - RAILS_ENV=development
    depends_on:
      db:
        condition: service_healthy

volumes:
  postgres_data:

Gemfile (Mínimo para iniciar)

source 'https://rubygems.org'
gem 'rails', '~> 8.0.0'

Execute touch Gemfile.lock para criar o arquivo de trava vazio.


3. Gerando o Projeto

Rode o comando para criar a estrutura do Rails sem instalar as gems localmente:

docker compose run --no-deps web rails new . --force --database=postgresql --skip-bundle

4. Ajustes Finais

Banco de Dados (config/database.yml)

Configure para ler as variáveis do Docker:

default: &default
  adapter: postgresql
  encoding: unicode
  host: <%= ENV.fetch("DATABASE_HOST") %>
  username: <%= ENV.fetch("DATABASE_USER") %>
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  port: 5432
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

Tailwind CSS v4

Instale e configure o watcher para Docker:

docker compose build
docker compose run --no-deps web bundle add tailwindcss-rails
docker compose run --no-deps web bundle exec rails tailwindcss:install

No arquivo Procfile.dev, altere para:

web: bin/rails server -p 3000 -b 0.0.0.0
css: bin/rails tailwindcss:watch[always]

5. Script de Atalho (./d)

Crie um arquivo d na raiz e dê permissão: chmod +x d.

#!/bin/bash
case "$1" in
  up)    docker compose up ;;
  build) docker compose build ;;
  c)     docker compose exec web bundle exec rails console ;;
  m)     docker compose exec web bundle exec rails db:migrate ;;
  rails) shift; docker compose exec web bundle exec rails "$@" ;;
  *)     docker compose exec web "$@" ;;
esac

6. Uso Diário

  1. Subir: ./d up
  2. Novo Scaffold: ./d rails g scaffold Post title:string
  3. Migrar: ./d m
  4. Instalar Gem: Adicione no Gemfile e rode ./d build

Acesse em: http://localhost:3001

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment