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).
- Docker e Docker Compose instalados.
- Conhecimento básico de terminal.
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 .envNo arquivo .env, adicione seu UID e GID (descubra-os rodando id -u e id -g no terminal):
UID=1000
GID=1000Focado 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"]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:source 'https://rubygems.org'
gem 'rails', '~> 8.0.0'Execute touch Gemfile.lock para criar o arquivo de trava vazio.
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-bundleConfigure 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 } %>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:installNo arquivo Procfile.dev, altere para:
web: bin/rails server -p 3000 -b 0.0.0.0
css: bin/rails tailwindcss:watch[always]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- Subir:
./d up - Novo Scaffold:
./d rails g scaffold Post title:string - Migrar:
./d m - Instalar Gem: Adicione no Gemfile e rode
./d build
Acesse em: http://localhost:3001