Adding docker to a Ruby on Rails application might seem like a herculean task at first, but it’s actually not as difficult as it seems. In this article, I will walk you through Docker and how to dockerize a rails application.

What is Docker?

Docker is a tool designed to make it easier to create, deploy, and run applications by using containers. Containers allow a developer to package up an application with all of the parts it needs, such as libraries and other dependencies, and deploy it as one package. Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers.

To install docker on your computer, click here and select your OS.

Creating a Rails Application

I am using rails 6 to create a new rails application called docker-rails, with Postgres and without running a test.

rails new docker-rails -T --database=postgresql

Dockerizing the Application

Add a file called Dockerfile to the root directory of your application. Notice the file has no extension. Add the following lines of code in that file. I will explain each line later.

  1. FROM ruby:2.7.1

  2. RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \ && apt-get install -y nodejs postgresql-client

  3. RUN mkdir /docker-rails

  4. WORKDIR /docker-rails

  5. COPY Gemfile /docker-rails/Gemfile

  6. COPY Gemfile.lock /docker-rails/Gemfile.lock

  7. RUN bundle install –full-index

  8. COPY . /docker-rails

  9. COPY entrypoint.sh /usr/bin/

  10. RUN chmod +x /usr/bin/entrypoint.sh

  11. ENTRYPOINT [“entrypoint.sh”]

  12. EXPOSE 3000

  13. CMD [“rails”, “server”, “-b”, “0.0.0.0”]

*  On line 1 we download Ruby; version 2.7.2 in this case.

*  On line 2 we install NodeJS along with all its dependencies and Postgres.

*  The code on line 3 creates a directory I called docker-rails. But you can call yours any name you like.

*  Line 4 sets docker-railsas our working directory that holds all our files.

*  Line 5 copies the content of the Gemfile from our directory to docker-rails/Gemfile in the container.

*  Line 6 also copies the content of Gemfile.lock.

*  Line 7 runs bundle install to install and update our new Gemfile and Gemfile.lock.

*  Line 8 copies the entire content from the current directory to our working directory in the container docker-rails/.

*  Line 9 copies the content of a file named entrypoint.sh We will add the file in a bit.

*  Line 10 grants access to the file while line number 11 specifies the file to be used as entrypoint.

*  Line 12 exposes port 3000 so we can run the rails app on our browser on port 3000.

*  Finally, Line 13 contains the command that will be executed to start or run the container.

Add a file named entrypoint.sh and copy the following to it.

#!/bin/bash 
set -e 

# If the database exists, migrate. Otherwise setup #(create and migrate) 

bundle exec rake db:migrate 2>/dev/null || bundle exec 

rake db:create db:migrate echo "Database has been created & migrated!"

# Remove server.pid if it exists 

rm -f /docker-rails/tmp/pids/server.pid

# execute container's main process (CMD in docker file) exec "$@"

The above code is executed when entrypoint is called in the Dockerfile. Add a file named docker-compose.yml. It will contain dependencies of the application. The code that should be in the file is shown below:

version: '3' 
services: 
    db: 
    image: postgres 
        environment:
            POSTGRES_PASSWORD: 'password1' 
            PGHOST: "db" 
            PGUSER: "postgres" 
            PGDBNAME: "docker-rails" 
        volumes: 
            - ./tmp/db:/var/lib/postgresql/data 
    web: 
        build: . 
            command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" 
    volumes: 
        - .:/docker-rails 
        ports: - "3000:3000" 
        depends_on: 
            - db 
    dns: 
        - 1.1.1.1 
        - 1.0.0.1

To build our docker container we run docker-compose build in the project root directory. This will download all required dependencies. After that, run docker-compose up to start our docker container. Visit localhost:3000 to see your app running in a docker container.

Phew! You just dockerized your first rails application, not so difficult…was it?