Начинается все не с создания Rails проекта, как можно было бы ожидать, а с создания контейнера для него при помощи Docker и Docker Composer.
Установка Docker
Устанавливаем Docker (если он не был установлен ранее). Ниже представлен вариант установки для Linux, к остальным вариантам отправляю на сайт Docker.
$ wget -qO- https://get.docker.com/ | sh
Проверяем успешность установки:
$ docker -v
Добавляем себя в группу docker:
$ sudo usermod -aG docker <имя_пользователя>
Установка Docker Compose
Для упрощения рутинных операций мы будем использовать Docker Compose (на данный момент нельзя использовать под Windows). Устанавливаем его самый простым способом и проверяем успешность установки:
$ sudo apt-get -y install python-pip
$ sudo pip install docker-compose
$ docker-compose --version
Создание Rails приложения
Создать папку приложения. В ней создать Gemfile (2 строки) и пустой Gemfile.lock. Содержимое Gemfile только указывает версию Rails, которую мы собираемся использовать (к примеру новую версию Rails 5):
source 'https://rubygems.org'
gem 'rails', '>= 5.0.0.beta1', '< 5.1'
Создать Dockerfile
Прежде всего указываем, какой образ будем использовать в качестве базового (c Docker Hub). В случае с Rails 5 нужно использовать образ, который поддерживает минимально Ruby версии 2.3. Далее по коду:
FROM ruby:2.3
# Задаем имя проекта
ENV APP_NAME <имя проекта>
# Устанавливаем базовые пакеты
RUN apt-get update -qq && apt-get install -y build-essential
# Для работы с Postgres
RUN apt-get install -y libpq-dev
# Для использования Nokogiri
RUN apt-get install -y libxml2-dev libxslt1-dev
# Для Capybara-webkit
RUN apt-get install -y libqt4-webkit libqt4-dev xvfb
# Для JS runtime
RUN apt-get install -y nodejs
# Создаем папку проекта и устанавливаем ее в качестве рабочей
RUN mkdir /$APP_NAME
WORKDIR /$APP_NAME
# Копируем в созданную папку Gemfile'ы и запускаем bundle
ADD Gemfile /$APP_NAME/Gemfile
ADD Gemfile.lock /$APP_NAME/Gemfile.lock
RUN bundle install
ADD . /$APP_NAME
После отрабатывания этого файла будут установлены все необходимые пакеты, будет создана папка проекта и установлена Rails.
Создать docker-compose.yml
С помощью Docker Compose мы будем создавать контейнеры (отдельно для Postgres и Rails приложения), создавать Rails проект и сразу же запускать rails-сервер. Содержимое файла docker-compose.yml:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/demodexcomplexru
ports:
- "3000:3000"
links:
- db
Запуск создания контейнера и приложения
Создаем контейнер, запускаем команду на создание нового Rails приложения (пропуская установку всех гемов):
$ docker-compose run web rails new .
-T --force --database=postgresql
--skip-bundle
Поскольку Docker работает от root, то и приложение создается от имени пользователя root. Меняем владельца:
$ sudo chown -R $USER:$USER .
Запускаем заново сборку контейнера, который и запускает bundler и устанавливает все необходимые гемы:
$ docker-compose build
Для подключения к базе в другом контейнере правим config/database.yml:
development: &default
adapter: postgresql
encoding: unicode
database: postgres
pool: 5
username: postgres
password:
host: db
test:
<<: *default
database: demodexcomplexru_test
Запускаем приложение (контейнер приложения)
$ docker-compose up
Создаем базу данных (в другом терминале)
$ docker-compose run web rake db:create
Проверяем работу приложения в браузере – http://0.0.0.0:3000.