カテゴリー: Server

DockerでRuby2.5、Rails5.2betaの環境をつくる【Compose file v3】

はじめに

明けましておめでとうございます。
年末年始休みに、少しRuby 2.5.0、Rails 5.2 beta2を触りました。
その際にDockerを使って環境を作成したので、そちらに関して記載したいと思います。

過去の記事とほぼ同様なのですが、Quick Startの記事をみていて、Docker Composeがバージョン3になったようなので、極力その書き方で行きたいと思います。

Compose file version 3 reference

今まで書いたDockerの記事

Dockerのインストール

Dockerをインストールします。
Macをお使いの方はDocker For Macが良いかと思います。

$ docker --version
Docker version 17.09.1-ce, build 19e2cf6
$ docker-compose --version
docker-compose version 1.17.1, build 6d101fb
$ docker-machine --version
docker-machine version 0.13.0, build 9ba6da9

ファイルの準備

まずはプロジェクトディレクトリを作成します。

$ mkdir my_project
$ cd my_project

Gemfile

Gemfileを作成します。
Docker起動前には、railsだけあれば大丈夫です。

source 'https://rubygems.org'
gem 'rails', '5.2.0.beta2'

Gemfile.lock

$ touch Gemfile.lock

Dockerfile

今回使用するイメージ用のDockerfileを作成します。
Rails用のコンテナと、MySQL用のコンテナを作成します。

Ruby(Rails)

個人的に、Docker用の設定ファイルを納めたディレクトリを作成しておいた方が管理が楽だと思うので、ディレクトリを切っておきます。

$ mkdir -p docker/ruby
$ cd docker/ruby

DockerfileはQuickstart: Compose and Railsの通りに作成します。

FROM ruby:2.5.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV ROOT_PATH /my_project
RUN mkdir $ROOT_PATH
WORKDIR $ROOT_PATH
ADD Gemfile $ROOT_PATH/Gemfile
ADD Gemfile.lock $ROOT_PATH/Gemfile.lock
RUN bundle install
ADD . $ROOT_PATH

MySQL

MySQLも同様にdockerディレクトリの中に専用のディレクトリを作成しておきます。

$ cd docker
$ mkdir mysql
$ cd mysql

Dockerfileは下記のように作成します。
言語設定用のファイルは別で作成しておき、起動時にコンテナに追加します。

FROM mysql:latest
 
RUN apt-get update
RUN apt-get install -y locales
RUN rm -rf /var/lib/apt/lists/*
ENV LC_ALL ja_JP.UTF-8
 
ADD ./docker/mysql/charset.cnf /etc/mysql/conf.d/charset.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4

docker-compose.yml

複数コンテナを操作するためのdocker-composeを使用します。

version: '3'
services:
  ruby:
    build:
      context: .
      dockerfile: ./docker/ruby/Dockerfile
    command: >
      bash -c "if [ -e tmp/pids/server.pid ]; then rm tmp/pids/server.pid ;fi \
        && ./bin/bundle install \
        && ./bin/bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - 3000:3000
    volumes:
      - .:/my_project
    depends_on:
      - mysql
    links:
      - mysql
      - mysql:database
      - mysql:mysql
  mysql:
    build:
      context: .
      dockerfile: ./docker/mysql/Dockerfile
    ports:
      - 3306:3306
    env_file: ./docker/mysql/.mysql_env

commandの部分

コンテナ起動時に実行するcommandですが、チュートリアルではrails serverだけです。
ただ、Dockerを不十分な形で終了すると、server.pidが残ってしまい、次回起動時にそれを削除する必要があります。
stop-the-application

そのため、起動時にもしserver.pidがあれば削除するようcommandを追加しています。

env_fileの部分

MySQLのコンテナではパスワードの環境変数などを指定してあげないと起動しません。
そのため、MySQLの環境変数を設定したファイルを読み込みます。

env_fileを指定することで、ファイルで指定した内容を環境変数として設定できます。
ファイルは、docker/mysql以下に作成しておきます。

MYSQL_ROOT_PASSWORD=root
MYSQL_USER=test
MYSQL_PASSWORD=testpassword
TZ='Asia/Tokyo'

起動

下記のコマンドで新しいプロジェクトを作成します。

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

これでプロジェクトが作成されたと思います。

下記のコマンドで起動します。
--buildオプションをつけると、起動前にビルドしてくれます。)

$ docker-compose up --build

-dでバックグラウンドで実行できますが、Railsでprintデバッグしたい場合などはログを表示させておいた方が良いかと思います。

DBの準備

起動しても、DBを作成していなければエラーになってしまいます。

まずはdatabase.ymlを修正します。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root
  host: mysql

先ほど、rootパスワードを設定したので、その値にします。
またhostは、docker-composeで指定した名前にすることで、よしなに判断してくれます。

この後は、DBの作成と初期マイグレーションを実行しておきます。
私もしっかりRails 5.2を確認していないのですが、初期マイグレーションファイルとして、ActiveStrage用のテーブルがあるようです。

$ docker-compose run web rake db:create
$ docker-compose run web db:migrate

ここまで実行すればRailsのウェルカムページが表示されるのではないでしょうか?

さいごに

新年初めのブログということと、地味にQuick Startが更新されていたので改めてまとめてみました。
やっぱりDockerだと、気軽に環境を作成できるので良いですね!

それでは本年もよろしくお願いします!

naoki85

シェア
執筆者:
naoki85
タグ: Docker

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前