O bundle fica no volume nomeado bundle_cache, que sombreia os gems da imagem — adicionar uma gem (ex.: caxlsx) causava Bundler::GemNotFound ao subir, mesmo com --build, pois o volume persistente não recebe os gems novos. Rodar bundle install no boot resolve de forma idempotente. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
46 lines
2.2 KiB
YAML
46 lines
2.2 KiB
YAML
version: '3.8'
|
|
|
|
services:
|
|
app:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
ports:
|
|
- "3000:3000"
|
|
env_file: .env
|
|
environment:
|
|
DATABASE_URL: ${DATABASE_URL}
|
|
DB_HOST: ${DB_HOST}
|
|
DB_PORT: ${DB_PORT}
|
|
DB_NAME: ${DB_NAME}
|
|
DB_USER: ${DB_USER}
|
|
DB_PASSWORD: ${DB_PASSWORD}
|
|
SECRET_KEY_BASE: ${SECRET_KEY_BASE}
|
|
RAILS_ENV: ${RAILS_ENV:-development}
|
|
volumes:
|
|
- ".:/app"
|
|
- "bundle_cache:/usr/local/bundle"
|
|
# No boot/deploy, em ordem:
|
|
# 1. db:prepare — cria o banco se não existir, roda migrations pendentes e
|
|
# só faz seed se o banco acabou de ser criado (idempotente, seguro).
|
|
# 2. whenever --update-crontab — grava no crontab os jobs do config/schedule.rb
|
|
# (ex.: atualizar histórico a cada 30 min, 08h-18h).
|
|
# 3. cron — sobe o daemon de cron (em background) que executa esses jobs.
|
|
# As variáveis de ambiente do banco vêm do .env via dotenv-rails quando
|
|
# o rake carrega o Rails, então o cron não precisa herdar o ENV.
|
|
# 4. rails s — sobe a aplicação (processo em primeiro plano).
|
|
# O passo do cron é "best-effort": se o crontab/cron não estiver disponível
|
|
# (ex.: imagem antiga sem o pacote `cron`), apenas avisa no log e SEGUE —
|
|
# nunca impede o Rails de subir. (Requer rebuild: docker compose up -d --build)
|
|
# `bundle check || bundle install`: os gems ficam num VOLUME nomeado
|
|
# (bundle_cache) que persiste e SOMBREIA os gems da imagem — então adicionar
|
|
# uma gem nova ao Gemfile não chega no container só com `up`/`--build`. Este
|
|
# passo instala o que faltar no volume no boot (idempotente e rápido quando já
|
|
# está tudo instalado), evitando o Bundler::GemNotFound ao subir.
|
|
command: bash -c "rm -f tmp/pids/server.pid && (bundle check || bundle install) && bundle exec rails db:prepare && { bundle exec whenever --update-crontab && cron || echo '[boot] AVISO cron/crontab indisponivel (rode com --build), seguindo sem agendamento'; } && bundle exec rails s -b 0.0.0.0"
|
|
# O banco PostgreSQL já existe externamente.
|
|
# Configure DB_HOST no .env com o IP/hostname do seu servidor PostgreSQL.
|
|
|
|
volumes:
|
|
bundle_cache:
|