はじめに
明けましておめでとうございます。
年末年始休みに、少しRuby 2.5.0、Rails 5.2 beta2を触りました。
その際にDockerを使って環境を作成したので、そちらに関して記載したいと思います。
過去の記事とほぼ同様なのですが、Quick Startの記事をみていて、Docker Composeがバージョン3になったようなので、極力その書き方で行きたいと思います。
Compose file version 3 reference
Dockerのインストール
Dockerをインストールします。
Macをお使いの方はDocker For Macが良いかと思います。
1 2 3 4 5 6 | $ 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 |
ファイルの準備
まずはプロジェクトディレクトリを作成します。
1 2 | $ mkdir my_project $ cd my_project |
Gemfile
Gemfileを作成します。
Docker起動前には、railsだけあれば大丈夫です。
1 2 | source 'https://rubygems.org' gem 'rails', '5.2.0.beta2' |
Gemfile.lock
1 | $ touch Gemfile.lock |
Dockerfile
今回使用するイメージ用のDockerfileを作成します。
Rails用のコンテナと、MySQL用のコンテナを作成します。
Ruby(Rails)
個人的に、Docker用の設定ファイルを納めたディレクトリを作成しておいた方が管理が楽だと思うので、ディレクトリを切っておきます。
1 2 | $ mkdir -p docker/ruby $ cd docker/ruby |
DockerfileはQuickstart: Compose and Railsの通りに作成します。
1 2 3 4 5 6 7 8 9 10 | 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ディレクトリの中に専用のディレクトリを作成しておきます。
1 2 3 | $ cd docker $ mkdir mysql $ cd mysql |
Dockerfileは下記のように作成します。
言語設定用のファイルは別で作成しておき、起動時にコンテナに追加します。
1 2 3 4 5 6 7 8 | 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 |
1 2 3 4 5 | [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4 |
docker-compose.yml
複数コンテナを操作するためのdocker-composeを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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
以下に作成しておきます。
1 2 3 4 | MYSQL_ROOT_PASSWORD=root MYSQL_USER=test MYSQL_PASSWORD=testpassword TZ='Asia/Tokyo' |
起動
下記のコマンドで新しいプロジェクトを作成します。
1 | $ docker-compose run web rails new . --force --database=mysql |
これでプロジェクトが作成されたと思います。
下記のコマンドで起動します。
(
--build
オプションをつけると、起動前にビルドしてくれます。)
1 | $ docker-compose up --build |
-d
でバックグラウンドで実行できますが、Railsでprintデバッグしたい場合などはログを表示させておいた方が良いかと思います。
DBの準備
起動しても、DBを作成していなければエラーになってしまいます。
まずは
database.yml
を修正します。
1 2 3 4 5 6 7 | 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用のテーブルがあるようです。
1 2 | $ docker-compose run web rake db:create $ docker-compose run web db:migrate |
ここまで実行すればRailsのウェルカムページが表示されるのではないでしょうか?
さいごに
新年初めのブログということと、地味にQuick Startが更新されていたので改めてまとめてみました。
やっぱりDockerだと、気軽に環境を作成できるので良いですね!
それでは本年もよろしくお願いします!