はじめに
タイトルの通りメモです。さらに筆者は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
これで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のデフォルトページが表示されますね。

おわり。