Setting up Rails for the first time with all the dependencies necessary can be daunting for beginners. Docked Rails attempts to flatten the onboarding curve by only requiring a working Docker installation in order to get started making a new Rails application, working with that application during development, and running a basic server. All based on pre-configured commands and dependencies living in a Docker image.
To use Docked Rails, follow these steps on macOS:
- Install Docker
- Copy'n'paste to run in terminal:
docker volume create ruby-bundle-cache alias rails='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle ghcr.io/rails/cli:latest' alias rails-server='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/rails/cli:latest server -b 0.0.0.0'
Or on Linux 64-bit:
- Install Docker
- Copy'n'paste to run in terminal:
docker volume create ruby-bundle-cache alias rails='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle ghcr.io/rails/cli-amd64:latest' alias rails-server='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/rails/cli-amd64:latest server -b 0.0.0.0'
Or on Windows (with PowerShell):
- Install WSL
- Install Docker
- Copy'n'paste to run in terminal:
docker volume create ruby-bundle-cache alias rails='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle ghcr.io/rails/cli-amd64:latest' alias rails-server='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/rails/cli-amd64:latest server -b 0.0.0.0'
Then you're ready to create your first Rails app:
rails new my-first-rails-app
cd my-first-rails-app
rails generate scaffold post title:string body:text
rails db:migrate
rails-server
That's it! You're running Rails on http://localhost:3000
.
The default for Rails 7 is to rely on importmaps for JavaScript, so you don't need to use any JavaScript build process. But if you know you need to work with React, or other heavy JavaScript front-end tooling, you should use Rails together with JS bundling. To setup, follow the same steps as above, then add the following alias:
On macOS:
alias rails-dev='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 --entrypoint bin/dev ghcr.io/rails/cli:latest'
Or on Linux 64-bit:
alias rails-dev='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 --entrypoint bin/dev ghcr.io/rails/cli-amd64:latest'
Or on Windows (with PowerShell):
alias rails-dev='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 --entrypoint bin/dev ghcr.io/rails/cli-amd64:latest'
Then create your app:
rails new my-first-rails-app -j esbuild
cd my-first-rails-app
rails generate scaffold post title:string body:text
rails db:migrate
- Edit the Procfile.dev in the root of your project and change the first line to:
web: bin/rails server -p 3000 -b 0.0.0.0
rails-dev
Now your development server will automatically compile any changes you make to the JavaScript in the project. Like with first setup, your server is running on http://localhost:3000
.
In addition to the alias for rails and rails-server (or rails-dev), it can be helpful also to map bundle, rake, or even yarn to run via Docker.
Follow these steps on macOS:
alias bundle='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint bundle ghcr.io/rails/cli:latest'
alias rake='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint rake ghcr.io/rails/cli:latest'
alias yarn='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint yarn ghcr.io/rails/cli:latest'
Or on Linux 64-bit:
alias bundle='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint bundle ghcr.io/rails/cli-amd64:latest'
alias rake='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint rake ghcr.io/rails/cli-amd64:latest'
alias yarn='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint yarn ghcr.io/rails/cli-amd64:latest'
Or on Windows:
alias bundle='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint bundle ghcr.io/rails/cli-amd64:latest'
alias rake='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint rake ghcr.io/rails/cli-amd64:latest'
alias yarn='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle --entrypoint yarn ghcr.io/rails/cli-amd64:latest'
- Setup pipeline to compile single multi-platform image (so darwin and amd64 can live together)
- Change the Procfile.dev in rails to bind to 0.0.0.0 by default?