Skip to content

Instantly share code, notes, and snippets.

@nav-mike
Last active May 3, 2021 07:12
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nav-mike/660712caebe6f6173e067781427d9025 to your computer and use it in GitHub Desktop.
Save nav-mike/660712caebe6f6173e067781427d9025 to your computer and use it in GitHub Desktop.
Использование docker compose с rails

Использование docker compose с rails + postgresql

Настройка проекта

Прежде чем начать, убедитесь, что у вас установлен docker и docker-compose, если же нет, то используйте ссылки в конце документа.

Для использования docker в своем проекте, первое, что нужно сделать, это добавить Dockerfile. Этот файл описывает процесс сборки контейнера для вашего проекта. В нем указываются настройки сборки и инструкции для установки зависимостей.

Пример такого файла для простого rails-проекта:

FROM ruby:2.3.3
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

Теперь, нужно добавить файлы зависимостей для rails: Gemfile и Gemfile.lock

Gemfile:

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

Gemfile.lock будет пустой сейчас, поэтому его просто нужно создать:

touch Gemfile.lock

Теперь нужно добавить файл docker-compose.yml, который используется для описания всех связанных с проектом контейнеров, их запуска и взаимодействия между ними.

Пример простого docker-compose.yml файла:

version: '3'
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

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

Теперь можно заняться сборкой проекта. Так как на данный момент у нас только файлы зависимостей и настроек docker, то воспользуемся командой для создания нового проекта. Если у вас проект уже есть, то сразу переходите к сборке контейнера.

Команда создания нового проекта:

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

Эта команда создаст проект и синхронизирует его с docker-контейнером.

Если вы используете Linux, то нужно дать доступ к изменению файлов проекта: sudo chown -R $USER:$USER.

Теперь можно собрать контейнер полностью:

docker-compose build <service_name>

<service_name> - это имя сервиса, который будет собран. Он выбирается из docker-compose.yml. Если имя не указывать, то будут собраны все сервисы.

Далее, нужно поправить настройки соединения с базой данных. В config/database.yml добавляются: имя пользователя, пароль и хост (имя хоста нужно взять из docker-compose.yml файла. В нашем случае, это db.)

Пример измененного файла базы данных:

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

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

Проект настроен и собран. Теперь можно перейти к запуску проекта и описанию команд.

Запуск проекта

Для запуска всех контейнеров (сервисов):

docker-compose up -d

Данная команда запустит все контейнеры и вернет управление в терминал.

docker-compose up <service_name>

Данная команда запустит сервис, имя которого указано, а также все связанные с ним сервисы (они указываются в depends_on в docker-compose.yml).

Результат работы можно увидеть в браузере, если открыть 0.0.0.0 с нужным портом. В текущем примере, это - 0.0.0.0:3000.

Основные команды работы с проектом

В разеделе указаны основные команды, которые следует использовать при разработке с использованием docker в development окружении.

Название команды Синтаксис команды Описание команды Пример команды
Запуск всех контейнеров (сервисов) docker-compose up -d Команда запустит все контейнеры и вернет управление в терминал.
Запуск конкретного контейнера docker-compose up <service_name> Команда запустит указанный контейнер и все контейнеры, которые связаны с ним. Команда не вернет управление в терминал. docker-compose up web
Остановка всех запущенных контейнеров docker stop $(docker ps -q) Команда остановит все запущенные контейнеры.
Отобразить список запущенных контейнеров docker ps Команда отображает в терминале список всех запущенных контейнеров.
Собрать все контейнеры docker-compose build Команда выполняет сборку всех контейнеров.
Собрать конкретный контейнер docker-compose build <service_name> Выполняется сборка только указанного контейнера. docker-compose build web
Удалить все контейнеры. docker rm $(docker ps -qa) Все ранее собранные контейнеры будут удалены.
Удалить конкретный контейнер docker rm <service_name> Будет удален указанный контейнер. Имя контейнера лучше брать из команды, которая отображает все запущенные контейнеры: docker ps. Имя контейнера немного отличается от имени сервиса из compose файла. Также вместо имени, можно использовать UID контейнера. docker rm myapp_web_1
Удалить все образы (образы используются в качестве основы для контейнеров) docker rmi $(docker images -q) Будут удалены все загруженные образы. Если использовать эту команду с командой удаления всех контейнеров, то получится полная очистка docker-а.
Запустить команду внутри контейнера docker-compose run <service_name> <command_text> Указанная команда будет запущена внутри контейнера. docker-compose run web rake db:create

Далее будут указаны команды, которые могут использоваться для работы с rails-проектом, в котором используется docker. В качестве примера используется контейнер web из примера выше.

Синтаксис команды Описание команды
docker-compose run web rake db:drop Удалить базу данных проекта
docker-compose run web rake db:create Создать базу данных проекта
docker-compose run web rake db:migrate Запустить миграции
docker-compose run web rake db:seed Заполнение базы данных сидами
docker-compose run web bundle Установка gem-ов. Эта команда добавит gem в Gemfile.lock. После этой команды нужно выполнить сборку контейнера
docker-compose run web rspec spec Запуск тестов rspec

Источники для более подробного изучения

Примечание

Все контейнеры собирались и проверялись на Ubuntu Linux 16.04 и macOS Sierra 10.12.5.

@solarisedigle
Copy link

Есть инструкция для более новых версий ruby 3+ && rails 6+?

@nav-mike
Copy link
Author

nav-mike commented May 3, 2021

Инструкции нет, но пробовал для ruby 2.7 и rails 6.1, все работает. Конфиги получаются примерно такие же.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment