DockerでRuby on Railsの開発環境を構築する

サーバーって必要なの? Ruby on rails
Ruby on rails プログラミング

Dockerの公式ドキュメント

  1. クィックスタート: Compose と Rails(ruby:2.3.3 rails:5.0.0.1)
  2. Quickstart: Compose and Rails(ruby:2.5 rails:~>5)

エラーが出た

ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

docker-compose.ymlのversion: "3.9"に対してエラーが出た!

version: "3.9"→version: "3"に変えたらできた

rails6系でDockerの開発環境を構築する

必要なファイル

  • Dockerfile
  • Gemfile
  • Gemfile.lock
  • entrypoint.sh
  • docker-compose.yml

Dockerfile

DockerはDockerfileから命令を読み込みイメージをビルドする。

あらかじめ用意されたコンテナイメージに対して実行するコマンドを記載する。docker buildを実行すると、コマンドライン命令を自動化した処理を行い、ビルド結果としてイメージが得られる。

Dockerfile

#イメージの指定
FROM ruby:2.7.0

# yarnのインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
  curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
  echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
  apt-get update && apt-get install -y yarn

# Node.jsのインストール
RUN apt-get update -qq && apt-get install -y nodejs yarn

# コンテナ内に作業ディレクトリを作成
RUN mkdir /myapp
WORKDIR /myapp
# Gemfileをコンテナ内の/myapp/Gemfileにコピー
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
# gemをインストール
RUN bundle install
# build contexのルートディレクトリをコンテナの/myappにコピー
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
# ポート3000をリッスン
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

GemfileとGemfile.lock

gemはRubyのライブラリであり、Gemfileはgemを指定し、バージョン管理を行うファイル。

Gemfile.lock は,Bundler によって生成されるファイル。

Gemfile

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

Gemfile.lockはファイルだけ作成し、中身は空のまま。

Gemfile.lock

entrypoint.sh

特定のserver.pidファイルが存在するときにサーバーが再起動しないようにするRails固有の問題を修正する。


#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

docker-compose.yml

アプリを構成するサービス(データベースとWebアプリ)、それぞれのDockerイメージを取得する方法やそれらをリンクしてWebアプリのポートを公開するために必要な構成を決める。

docker-compose.yaml

version: "3"
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"
    volumes:
      - ./tmp/db:/var/lib/mysql

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

image:

利用するイメージの指定。

environment:

MYSQL_ROOT_PASWORD

必須の変数。rootアカウントのパスワードを指定。

MYSQL_DATABASE

オプションの変数。イメージ起動時に作成するデータベースの名前を指定。

  • MYSQL_USER
  • MYSQL_PASSWORD

上記の変数を使って、新規ユーザーの作成とパスワードの設定ができる。

volumes:

コンテナのライフサイクルが終了した後でもデータを保管しておけるデータ領域。

ホスト側のディレクトリを volume としてコンテナ内にマウントし、ホストとコンテナ間でファイルを受け渡すときに利用する。

build:

既存のイメージではコンテナの要件が満たせない場合は、build でイメージのビルドに関する設定を指定。

build を指定すると、ローカルのキャッシュにイメージがない場合、コンテナ起動前にイメージのビルドが走り、イメージを作成する。

今回はルートディレクトリにあるDockerfileをビルドする。

command:

コンテナ起動時のコマンドを指定。

command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"

tmp/pids/server.pidファイルを削除して、Gemfileで指定した環境でRailsサーバーを立ち上げる。

-p ・・・サーバを起動するときのポート番号を指定

-b ・・・バインドするIPアドレスを指定

depend_on:

依存先のサービス名を記載し、サービスの依存関係を指定。

railsファイルの作成

docker-compose run webでサービスに対して1回限りのコマンドを実行する。

サービスの構成で定義された新しいコンテナを開始し、railsファイルを作成する。

ターミナル
docker-compose run web rails new . --force --no-deps --database=mysql

--force ・・・ファイルが存在する場合に上書きする

--no-dps ・・・リンクしたサービスを起動しない

--database ・・・データベースの種類

"Installing sassc 2.4.0 with native extensions"で結構時間かかる

イメージをビルド

ターミナル
docker-compose build

新たなGemfileが作成されたので、イメージを再ビルドすることが必要。

docker imegesで確認すると、先に作ったイメージの名前が<none>に変わり、新しいイメージが作成される。

database.ymlに追記とデータベースの作成

database.ymlにhost/username/passwordを追記(docker-compose.ymlに設定したもの)

database.yml

#development:に追記
  host: db
  username: root
  password: password

#test:に追記
  host: db
  username: root
  password: password


データベースの作成。

ターミナル
docker-compose run web rails db:create

Webpackerのインストール

ターミナル
docker-compose run web rails webpacker:install

エラーが出た場合

エラー
rails aborted!
Don't know how to build task 'webpacker:install' (See the list of available tasks with `rails --tasks`)

インストールができないエラーが出た。

Gemfileにwebpackerのバージョンを指定する行を追加して、イメージをビルドし直したらインストールできた。

Genfile
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'

サービスの起動

ターミナル
docker-compose up -d

localhost:3000を確認する。

見れない時はhostsの設定を確認してみるといいかも。

色々うまくいかなかった

エラー
[“entrypoint.sh”]: not found

“と"の違いでエラーが出た。

rails newでファイルが作成されないなど色々つまづいた。

うまくいかない時は一旦、コンテナやイメージを削除してやり直したらうまくいった。

参考にさせていただいたページ

タイトルとURLをコピーしました