🐣

docker-composeでRails6の開発環境構築備忘録

2021/07/26に公開

概要

素直に環境構築できる情報にあまりたどり着けなかったので、APIモードではなく通常のモードでRailsの環境を作る方法を備忘録として残しておく。
本番環境を作りたい場合は別途本番用のDockerfileを準備してください。

バージョン

Ruby: 2.7.4
Rails: 6.0.4
Nginx: 1.20.x
PostgreSQL: 12.x

構成図

NginxでRailsにRPする構成で作成

ディレクトリ構成

docker関連ファイルを.docker配下に格納しています。

.
├── .docker
│   ├── db
│   └── nginx
│       ├── Dockerfile
│       └── conf
│           └── default.conf
├── .git
├── .gitignore
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── docker-compose.yml
└── docker-entrypoint.sh

各種ファイル

docker-compose.yml

version: '3'
services:
  nginx:
    container_name: nginx
    build:
      context: .docker/nginx
      dockerfile: Dockerfile
    ports:
      - 80:80
    depends_on:
      - app

  app:
    container_name: app
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      TZ: 'Asia/Tokyo'
      RAILS_ENV: 'development'
      DATABASE_HOST: 'db'
      DATABASE_NAME: 'app_development'
      DATABASE_USER: 'docker'
      DATABASE_PASSWORD: 'docker'
    volumes:
      - .:/app
    expose:
      - 3000
    tty: true
    stdin_open: true
    depends_on:
      - db

  db:
    image: postgres:12-alpine
    container_name: db
    environment:
      TZ: 'Asia/Tokyo'
      POSTGRES_USER: 'docker'
      POSTGRES_PASSWORD: 'docker'
      POSTGRES_DB: 'app_development'
    volumes:
      - database:/var/lib/postgresql/data
      - ./.docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 5432:5432

volumes:
  database:

appのDockerfile

  • webpackerを使うためyarnを追加しています
  • ホストのIDEで補完を効かせたいためbundle installのpathはvendor/bundleにしています
FROM ruby:2.7.4

ENV TZ Asia/Tokyo
ENV LANG C.UTF-8

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs yarn && \
    apt-get clean && \
    rm -rf /var/cache/apt

WORKDIR /app

COPY Gemfile Gemfile.lock /app/

RUN bundle install --path vendor/bundle

CMD ["/bin/bash", "/app/docker-entrypoint.sh"]

コンテナ立ち上げ時のスクリプト(docker-entrypoint.sh)

pidが残ってサーバーが起動できない場合があるため、実行時に削除処理をします。

#!/bin/bash

I="\e[1;32m::\e[00m"

echo -e "$I Starting Rails Server..."
rm -f /app/tmp/pids/server.pid
bundle exec rails server -b '0.0.0.0'

nginxのDockerfile

FROM nginx:1.20

RUN rm -f /etc/nginx/conf.d/*

COPY conf/default.conf /etc/nginx/conf.d/default.conf

nginxのconf

railsにRPするため、コンテナ名の「app」を指定している

server {
    listen 80;

    proxy_set_header    Host                 $host;
    proxy_set_header    X-Real-IP            $remote_addr;
    proxy_set_header    X-Forwarded-Host     $host;
    proxy_set_header    X-Forwarded-Server   $host;
    proxy_set_header    X-Forwarded-For      $proxy_add_x_forwarded_for;

    location / {
        proxy_pass    http://app:3000;
    }
}

Gemfile

source 'https://rubygems.org'
gem 'rails', '~> 6.0.4'

Gemfile.lock

空のファイルでよい

環境構築手順

  1. 各種コンテナのBuild
    $ docker-compose build
    
  2. ライブラリの準備(railsコマンドが有効になる)
    $ docker-compose run --rm app bundle install
    
  3. Railsの初期化
    $ docker-compose run --rm app bundle exec rails new . -f -B -d postgresql
    
  4. Railsの依存ライブラリがGemfileに書き出されるのでもう一回bundle install
    $ docker-compose run --rm app bundle install
    
  5. webpackerの追加(Pumaを立ち上げようとすると怒られるため追加)
    $ docker-compose run --rm app bundle exec rails webpacker:install
    
  6. database.ymlの編集(DB設定をしないとDB接続エラーになる)
    # config/database.yml
    
    default: &default
    adapter: postgresql
    encoding: unicode
    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
    
    development:
    <<: *default
    host: <%= ENV['DATABASE_HOST'] %>
    database: <%= ENV['DATABASE_NAME'] %>
    username: <%= ENV['DATABASE_USER'] %>
    password: <%= ENV['DATABASE_PASSWORD'] %>
    
    test:
    <<: *default
    host: <%= ENV['DATABASE_HOST'] %>
    database: app_test
    username: <%= ENV['DATABASE_USER'] %>
    password: <%= ENV['DATABASE_PASSWORD'] %>
    
    production:
    <<: *default
    database: app_production
    username: app
    password: <%= ENV['APP_DATABASE_PASSWORD'] %>
    
    
  7. 起動
    $ docker-compose up
    
  8. ブラウザでhttp://localhost
    例の画面が表示される

Gemの追加手順

  1. Gemfileに記述

    gem 'kaminari'
    
  2. 起動中に下記コマンドでGemの追加

    $ docker-compose exec app bundle install 
    
  3. Appの再起動

    $ docker-compose restart
    

終わりに

備忘録となりますので細かい説明は省いてありますが、これでIDE側で補完を有効にしながらRailsの開発ができるようになると思います。

Discussion