tsyama記

プログラミングとそのほか

DockerでRuby on Rails開発の準備をするメモ

はじめに

タイトルの通りメモです。さらに筆者はRuby初心者なので内容についてはあまり信頼がおけません。

前提

一応対象読者は下記です。こんな人なら多少参考になるかもしれません。

  • Dockerがある程度使える(のでDocker自体の解説はあまりしない)
  • railsはもちろんruby自体よくわかっていない

dockerで環境構築

version: '3'

services:
  web:
    image: ruby:2.5.3
    volumes:
      - ./web/src/:/usr/src/
    command: tail -f /dev/null

まずは雑にこんなdocker-compose.ymlを作成します。

  • rubyは記事執筆時点で2.5.3が安定版の最新バージョンのようです
  • rubyイメージはそのままだと起動してすぐ死ぬので、とりあえず起動しっぱなし用コマンドを入れておきます
  • railsのアプリケーションディレクトリは/usr/src/以下に置くイメージです

これでとりあえずコンテナ起動して入れる状態にはなったので、docker-compose upしてdocker execします。
あと知らなかったんですが、docker-composeにいつの間にかdocker-compose execコマンドが追加されていて、例えば今回であればdocker-compose exec web bashとかでコンテナが起動できるようになったみたいです。地味に便利。

コンテナに入れたら、とりあえずおまじないをして、

apt-get update

Ruby on Railsに必要なsqlite3を入れます。

apt-get install sqlite3

あとはrailsをインストールしてやります。

gem install rails

gemはPHPでいうcomposerみたいなものっていう認識なんですが、railsのインストールされた場所を見てみたら/usr/local/bundle/bin/railsにあるみたいだし、global installしてもホームディレクトリに置かれるcomposerよりも、挙動としてはyumとかapt-getに近いものなのかもしれません。

rails --version

railsがインストールされたのを確認したら、新しくrailsプロジェクトを作成します。
プロジェクトを作成したいディレクトリに移動して

rails new blog

と入力します。blog部分はプロジェクト名なのでなんでもよいのですが、今回は公式のチュートリアルにのっとって進めます。
実行が完了したら、railsプロジェクトの各種ファイルが生成されていること、それらが適切なvolumes設定によりdockerホストに同期されていることを確認しましょう。

ちなみにrails new実行時に自動でbundle installというコマンドも実行されているようです。bundle(bundler)はgemと同じくgemを管理できるツールですが、gemよりもこちらの方がcomposerとかの挙動に近そうです。
bundle installを実行すると、Gemfileというファイル(実際はGemfile.lock)を参考に、依存性を解決しつつインストールを行います。インストール先はデフォルトだとgemと同じですが、--pathオプションでインストール先を指定することもできるようです。

railsは親切なので、開発用のwebサーバが用意されています。

bin/rails server

でwebサーバを起動してみます。

 Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.

というエラーが表示されました。nodejsを入れてやると解決するようです。

apt-get install nodejs

qiita.com

これでwebサーバが無事起動するのですが、こいつはサーバの3000番ポートで待ち受けます。そういえばコンテナのポートを開けてなかったのでdocker-compose.ymlの設定を変更します。合わせてここまでの作業をイメージ化しておきましょう。

まずはこれがdocker-compose.yml

version: '3'

volumes:
  bundle:

services:
  web:
    build: ./web/
    volumes:
      - ./web/src/:/usr/src/
      - bundle:/usr/local/bundle/
    ports:
      - 3000:3000
    command: tail -f /dev/null

そしてwebコンテナのDockerfileです。

FROM ruby:2.5.3

RUN apt-get -y update
RUN apt-get install -y \
    sqlite3 \
    nodejs

RUN gem install rails

docker-compose.ymlのbundleボリュームについては、bundle installでインストールされたgemを永続化しておくものです。これをしておかないとコンテナを起動するたびにbundle installをしなくてはならなくなります。

あとはbin/rails serverしてdockerホストに3000番ポートでアクセスすればrailsのデフォルトページが表示されますね。

f:id:tsyama-desu:20181115000448p:plain

おわり。