Быстрый старт: Docker Compose и Rails

Данное руководство продемонстрирует вам как использовать Docker Compose для установки и запуска приложения Rails/PostgreSQL. Перед началом, убедитесь что Compose установлен.

Определяем компоненты проекта

Начните с создания трех файлов которые потребуются вам для сборки приложения. Во-первых, поскольку ваше приложение будет работать внутри Docker контейнера содержащего все зависимости, вам нужно указать что нужно включить в контейнер. Это делается с помощью файла Dockerfile. Для начала создадим Dockerfile и добавим в него следующее содержимое:

FROM ruby:2.2.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

Вышеприведенные инструкции разместят код вашего приложения внутри образа из которого будет создан контейнер с Ruby, Bundler и всеми зависимостями. Более подробную информацию как писать Dockerfiles, вы можете получить в руководстве пользователя Docker и руководстве по Dockerfile.

Далее создадим Gemfile который будет загружать Rails. Он будет перезаписан rails new.

source 'https://rubygems.org'
gem 'rails', '4.2.0'

Вам нужен пустой Gemfile.lockчто бы собрать наш Dockerfile.

$ touch Gemfile.lock

И наконец, файл docker-compose.yml в котором происходит вся магия. Этот файл описывает сервисы из которых состоит приложение (база данных и web-приложение). Также данный фал содержит инструкции по получению каждого Docker образа (база данных будет работать на уже существующем образе PostgreSQL, а web-приложение будет собрано из текущей директории). И в этом же файле указывается настройки по связям сервисов и используемым портам.

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

Сборка проекта

С помощью этих трех файлов, вы можете создать скелетон Rails приложения выполнив следующую команду:

$ docker-compose run web rails new . --force --database=postgresql --skip-bundle

Сперва, Compose соберет образ для web-сервиса используя Dockerfile. Затем он запустит rails new внутри нового контейнера созданного на основе этого образа. После завершения, вы получите созданное приложение:

  $ ls -l
  total 56
  -rw-r--r--   1 user  staff   215 Feb 13 23:33 Dockerfile
  -rw-r--r--   1 user  staff  1480 Feb 13 23:43 Gemfile
  -rw-r--r--   1 user  staff  2535 Feb 13 23:43 Gemfile.lock
  -rw-r--r--   1 root  root   478 Feb 13 23:43 README.rdoc
  -rw-r--r--   1 root  root   249 Feb 13 23:43 Rakefile
  drwxr-xr-x   8 root  root   272 Feb 13 23:43 app
  drwxr-xr-x   6 root  root   204 Feb 13 23:43 bin
  drwxr-xr-x  11 root  root   374 Feb 13 23:43 config
  -rw-r--r--   1 root  root   153 Feb 13 23:43 config.ru
  drwxr-xr-x   3 root  root   102 Feb 13 23:43 db
  -rw-r--r--   1 user  staff   161 Feb 13 23:35 docker-compose.yml
  drwxr-xr-x   4 root  root   136 Feb 13 23:43 lib
  drwxr-xr-x   3 root  root   102 Feb 13 23:43 log
  drwxr-xr-x   7 root  root   238 Feb 13 23:43 public
  drwxr-xr-x   9 root  root   306 Feb 13 23:43 test
  drwxr-xr-x   3 root  root   102 Feb 13 23:43 tmp
  drwxr-xr-x   3 root  root   102 Feb 13 23:43 vendor

Если вы запускаете Docker на Linux, файлы rails new создаются с владельцем root. Это происходит по тому контейнер работает под root пользователем. Измените владельца для новых файлов:

  sudo chown -R $USER:$USER .

Если вы запускаете Docker на Mac или Windows, у вас уже выставлены правильные права для файлов, включая созданные rails new. Посмотрите список файлов для того что бы убедиться в этом.

Раскомментируйте строку в вашем Gemfile которая загружает therubyracer, теперь у вас есть Javascript runtime:

gem 'therubyracer', platforms: :ruby

После того как вы создали новый Gemfile, вам нужно собрать образ заново (Изменения в Dockerfile или в используемых им файлах требуют пересборки образа).

$ docker-compose build

Подключение к базе данных

Приложение уже можно загрузить, но еще не польностью готово. По умолчанию, Rails пытается подключиться к базе данных на localhost - вам нужно изменить его на db. Вам также нужно изменить название базы и пользователя.

Замените содержимое файла config/database.yml следующим:

development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test

Теперь вы можете загрузить приложение командой:

$ docker-compose up

Если все хорошо, вы увидите вывод PostgreSQL и спустя несколько секунд похожие сообщения:

myapp_web_1 | [2014-01-17 17:16:29] INFO  WEBrick 1.3.1
myapp_web_1 | [2014-01-17 17:16:29] INFO  ruby 2.2.0 (2014-12-25) [x86_64-linux-gnu]
myapp_web_1 | [2014-01-17 17:16:29] INFO  WEBrick::HTTPServer#start: pid=1 port=3000

И наконец, вам нужно создать базу данных. Выполните в другом терминале команду:

$ docker-compose run web rake db:create

Вот и все. Ваше приложение запущено на 3000 порту Docker хоста. Если вы используете Docker Machine, то с помощью команды docker-machine ip MACHINE_VM можете узнать IP адрес Docker хоста на котором запущено приложение.

Rails example

Примечание:Если вы остановите приложение а затем запустите его заново, вы можете увидеть следующую ошибку: web_1 | A server is already running. Check /myapp/tmp/pids/server.pid. Один из сособов решить проблему удалить tmp/pids/server.pid, а затем перезапустить приложение командой docker-compose up.

Дополнительная документация по Compose


Комментарии:

Комментариев нет, желаете стать первым?

Пожалуйста, авторизуйтесь что бы оставлять комментарии.