This document describes the Docker-based development environment for BetterStructureSql.
The Docker environment includes:
- PostgreSQL 15 - Database service (internal network only)
- Rails Integration App - Web interface accessible on port 3000
- Persistent Storage - PostgreSQL data survives container restarts
- Live Reload - Gem source code mounted for development without rebuild
- Docker Engine 20.10+
- Docker Compose 2.0+
- Port 3000 available on host
docker compose upThis single command will:
- Build the Docker image (first time only)
- Start PostgreSQL service
- Wait for database to be ready
- Run database migrations
- Seed sample data
- Start Rails server on port 3000
Open your browser to http://localhost:3000
The web interface shows:
- Current schema version statistics
- Environment information
- Link to browse stored schema versions
# Build images
docker compose build
# Start services in foreground
docker compose up
# Start services in background
docker compose up -d
# View logs
docker compose logs -f web# Run migrations
docker compose exec web rails db:migrate
# Seed database
docker compose exec web rails db:seed
# Reset database
docker compose exec web rails db:reset
# Open Rails console
docker compose exec web rails console
# Open database console
docker compose exec web rails dbconsole# Dump schema to structure.sql
docker compose exec web rails db:schema:dump
# Store current schema version
docker compose exec web rails db:schema:store
# List stored schema versions
docker compose exec web rails db:schema:versions
# Clean up old schema versions
docker compose exec web rails db:schema:cleanup# Run full test suite
docker compose exec web bundle exec rspec
# Run specific test file
docker compose exec web bundle exec rspec spec/models/user_spec.rb
# Run Rubocop
docker compose exec web bundle exec rubocop# Stop services (preserves data)
docker compose down
# Stop and remove volumes (deletes database data)
docker compose down -v
# Remove all containers, networks, and images
docker compose down --rmi all -vThe following environment variables are configured in docker-compose.yml:
| Variable | Default | Description |
|---|---|---|
DATABASE_HOST |
postgres |
PostgreSQL service hostname |
DATABASE_USERNAME |
postgres |
Database username |
DATABASE_PASSWORD |
postgres |
Database password |
DATABASE_NAME |
better_structure_sql_development |
Database name |
RAILS_ENV |
development |
Rails environment |
You can override these in a .env file or directly in docker-compose.yml.
- Purpose: Persists PostgreSQL database files
- Location: Docker managed volume
- Cleanup:
docker compose down -v
- Purpose: Caches Ruby gems to speed up builds
- Location: Docker managed volume
- Cleanup:
docker compose down -v
- Source: Current directory (
.) - Target:
/appin container - Purpose: Live code changes without rebuild
- Note: Changes to gem source reflect immediately in running container
better_structure_sql/
βββ Dockerfile # Container image definition
βββ docker-compose.yml # Service orchestration
βββ docker-entrypoint.sh # Startup script
βββ .dockerignore # Files excluded from build
βββ integration/ # Rails integration app
β βββ app/
β βββ config/
β β βββ database.yml # Database configuration
β β βββ initializers/
β β βββ better_structure_sql.rb # Gem configuration
β βββ db/
β β βββ migrate/ # Database migrations
β β βββ seeds.rb # Sample data
β βββ Gemfile # Includes gem as local dependency
β βββ ...
βββ lib/ # Gem source code (mounted in container)
- Edit gem source code in
lib/ - Changes are immediately available in the container (no rebuild needed)
- Restart the Rails server if needed:
docker compose restart web
- Generate migration in the integration app:
docker compose exec web rails generate migration AddFieldToUsers - Edit the migration file in
integration/db/migrate/ - Run migrations:
docker compose exec web rails db:migrate
- Make schema changes via migrations
- Dump schema:
docker compose exec web rails db:schema:dump - View the generated file:
docker compose exec web cat db/structure.sql
docker compose logs -f webdocker compose exec web rails dbconsole-- List all tables
\dt
-- Describe schema_versions table
\d better_structure_sql_schema_versions
-- Query schema versions
SELECT id, pg_version, format_type, created_at, LENGTH(content) as size
FROM better_structure_sql_schema_versions
ORDER BY created_at DESC;docker compose ps
docker compose exec web bundle exec rails runner "puts Rails.env"# Find process using port 3000
lsof -i :3000
# Kill the process or change port in docker-compose.yml
ports:
- "3001:3000"# Check PostgreSQL service status
docker compose ps postgres
# View PostgreSQL logs
docker compose logs postgres
# Restart PostgreSQL
docker compose restart postgres# Ensure entrypoint script is executable
chmod +x docker-entrypoint.sh
# Rebuild image
docker compose build --no-cache# Remove bundle cache and rebuild
docker compose down -v
docker compose build --no-cache
docker compose upEnsure you're not using docker compose down -v which removes volumes. Use docker compose down instead.
# For gem code changes
docker compose restart web
# For Gemfile changes
docker compose down
docker compose build
docker compose up
# For database schema changes
docker compose exec web rails db:migrate- Use volumes for gems: The
bundle_cachevolume speeds up builds significantly - Avoid rebuilding: Source code is mounted, so most changes don't require rebuild
- Clean up regularly: Remove unused volumes and images
docker system prune -a --volumes
- Use build cache: Docker caches layers, so order matters in Dockerfile
# Clean start
docker compose down -v
docker compose build
docker compose up -d
# Wait for services to be ready (about 30 seconds)
sleep 30
# Check services are running
docker compose ps
# Verify web app is accessible
curl http://localhost:3000
# Check database has data
docker compose exec web rails console
# In Rails console:
# User.count
# Post.count
# exit
# Test persistence
docker compose restart postgres
docker compose exec web rails console
# Verify data still exists# PostgreSQL health check
docker compose exec postgres pg_isready -U postgres
# Rails health check
curl http://localhost:3000/upAfter setting up the Docker environment:
- Explore the Web UI: Visit http://localhost:3000/better_structure_sql/schema_versions
- Test Schema Dumping: Make changes and dump schema
- Browse Schema Versions: View stored versions in the web interface
- Run Tests: Execute the test suite in the container
- Develop Features: Modify gem code and test in real-time