Writing a custom Dockerfile for Rails

Overview

If we detect that your application uses Rails we will suggest a default Dockerfile for you to use (see below). This file should work for most Rails (or Rack) applications, but if your app has some unusual requirements you may need to modify it or write your own from scratch. This doc will walk you through the basics of doing so.

Before following this guide, we recommend getting acquainted with the basics of the Docker platform. Because you’re using Maestro, most of the Docker tasks and processes described will be completely automated, but it is useful to understand why a Dockerfile is necessary and what it does.

Default Rails Dockerfile

This is the Dockerfile we will suggest for Rails apps that do not already have one:

FROM ruby:latest
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq && apt-get install -y build-essential nodejs yarn 
ENV APP_HOME /app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
# This installs bundler 2x. Change if you need any of the older versions
RUN gem install bundler:2.1.2
ADD Gemfile* $APP_HOME/
# This is a bundler 2 format. For bundler 1, you can add --without development test to the bundle install line
RUN bundle config set without 'development test'
RUN bundle install
ADD . $APP_HOME
# if you're not using webpack, you can comment out the following line
RUN yarn install --check-files
RUN SECRET_KEY_BASE=$SECRET_KEY_BASE RAILS_ENV=production bundle exec rake assets:precompile

A few notable things that this Dockerfile does:

The file is obviously customisable as needed. For example, you can change the version of Bundler by updating the RUN gem install bundler:2.1.2 line.

Writing your own Dockerfile

We generally recommend against writing your own Dockerfile from scratch, but the basics are not difficult to master. Before starting you should have a firm understanding of basic Docker commands (RUN, ENV, ADD, WORKDIR).

The order of the commands is extremely important. If you try to run a component before one of its dependencies, the build will fail.

The simplest possible Dockerfile for a Rails application looks something like this:

FROM ruby:latest  # Tells the image to use the latest version of Ruby
RUN mkdir /app  # Creates a directory called "app"
WORKDIR /app  # Sets that directory as your working directory
RUN bundle install  # Installs all your Bundler dependencies inside the image
ADD . /app  # Copies your code to the image

This image is obviously missing components that you might need (for example Yarn and Webpack), but you can add these as needed.