Ruby on Rails + MySQL 開発環境を Dockerで構築

    はじめに

    TechAcademyの Webエンジニアになるべく、Webアプリケーションコースを受講している。

    受講の感想はあとで書くとして、このコースの課題としてRailsアプリをつくることになった。

    自分のPCはUbuntuなので、環境は比較的容易に作成できるものの、やはりローカル環境はあまり汚したくないので、 流行りのDockerを利用することにした。けっこう、この手の情報は Web上になかったので、まとめてみる。

    Dockerを、正確には Docker Composeを利用することで、Railsのコンテナと MySQLのコンテナを Dockerで動かし、 Rails server, DB serverをローカル環境にインストールすることなく、開発が可能になるのだ。

    それでは、いってみよう。

    設定ファイルの用意

    Gemfile, Gemfile.lock の準備

    Docker内で bundle install を実行して railsをインストールするために, Gemfileを用意。

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

    空の Gemfile.lockも用意。

    Dockerfileの準備

    以下のような、Dockerfileを用意。

    FROM ruby:2.4.1
    RUN apt-get update -qq && apt-get install -y build-essential nodejs
    RUN mkdir /app
    WORKDIR /app
    COPY Gemfile /app/Gemfile
    COPY Gemfile.lock /app/Gemfile.lock
    RUN bundle install
    COPY . /app

    docker-compose.ymlを用意

    webと dbの2つのコンテナをたちあげる docker-compose.ymlを用意。

    version: '3'
    services:
      web:
        build: .
        command: bundle exec rails s -p 3000 -b '0.0.0.0'
        volumes:
          - .:/app
        ports:
          - 3000:3000
        depends_on:
          - db
        tty: true
        stdin_open: true
      db:
        image: mysql:5.5
        volumes:
          - db-volume:/var/lib/mysql
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      db-volume:

    docker-composeの実行

    Railsのコンテナを起動してRailsのプロジェクトを作成する。

    $ docker-compose run web rails new . --force --database=mysql --skip-test

    Railsイメージのビルドを実行する。

    $ docker-compose build

    config/database.ymlのdefault内の項目 host: localhostを dbにを修正。

    コンテナをデタッチドモード(バックグラウンド)で実行する

    $ docker-compose up -d

    RailsのコンテナでDB作成のタスクを実行する

    $ docker-compose run web bundle exec rake db:create

    マウントしたvolumeの書き込み権限がない問題

    Dockerの操作は基本すべてroot権限で実行されるので、生成されたRailsアプリの所有権が root:root となる。ログインユーザーに変更しておく。

    $ sudo chown -R $USER:$USER .