バックエンド

【Ruby on Rails7環境構築】Dockerでrails newする

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

rails newとは?

rails newとは、
文字通り、新しいrailsアプリケーションを作成するコマンドです。

rails new | Railsドキュメント (railsdoc.com)

本記事では、Dockerを使うので、
ローカル環境にrailsをインストールしませんが、
Dockerを使わない場合は、
railsをインストールしないと、
上記のコマンドは使えません。

個人開発であれば、
rails newする機会はたくさんあると思いますが、
実務だと、rails newコマンドは、
新規開発プロジェクトの立ち上げになりますので、
一定レベルのエンジニアかつ立ち位置でないと触れる機会が少ないコマンドです。

その点、ある意味伝説のコマンドです(笑)

ちなみに、私は新入社員チームの発表会のようなときに、
リーダーとして、rails newした経験がありますが、
これも正確には、実務ではないので、
私も実務でrails newした経験はまだありません。

若干脱線しましたが、
rails newコマンドには、
ドキュメントに記載があるように、
オプションが色々あり、
DBの指定や、apiモードの指定など、
rails newの時点で行えます。

PostgreSQLを使う場合(サンプルコマンド)

rails new <appname> -d postgresql

-dオプションでDBを指定します。
デフォルトでは、sqlite3が使われますが、
実務ではほとんど使わないので、
実質上のデフォルトは、postgresqlと言っても過言ではありません。

もういい加減、
sqliteをデフォルトにするのやめませんか?って
思いますが、何か理由があるんでしょうかね。

他に有名なDBとしては、
mysqlなどもありますが、
どういうわけか、Rails界隈では、
postgresqlが人気があるので、
mysqlが採用されているケースは、
postgresqlよりは少ない印象です。
(ないわけではありません)

さて、書式については、
-database=DATABASEという書式でも同様です。

ちなみに、特定のバージョンのrailsでrails newしたい場合は、

rails _6.1.4_ new <appname>

とすることで実行できます。

上記だと、6.1.4のrailsがインストールされます。

Railsは、5系、6系、7系で、
微妙に挙動が違ったりするので、
上記のようにバージョン指定でインストールする場面もあるかもしれません。

Ruby on Railsのドキュメント

ちなみに、Ruby on Railsでよく参照するドキュメントは、
上記のRailsドキュメントや、Rails ガイドが多いです。

https://railsdoc.com/

https://railsguides.jp/

いや、それにしてもRailsの場合、
日本語で公式ドキュメントが読むことができるのが素晴らしいですね。

これに慣れすぎると、
英語のドキュメントが読めなくなってしまいます。(震え声)

一応、Railsにも英語のドキュメントがあり、
稀ですが、上記の2つのドキュメントには記載がない、
メソッドなどについて、調べたいときに参照したりします。

https://api.rubyonrails.org/

強強エンジニアに、Railsについて、
質問すると、一定の確率で、
上記の英語のドキュメントが返ってきます(笑)

あと、Railsは普通にGithubにもコードがあるので、
ドキュメントどころか、コードを読めって言ってくる仙人エンジニアもいます。

https://github.com/rails/rails

最初のうちは、
私が推奨した、日本語の2つのドキュメントだけ参照する形でも
十分かと思います。

というか、上記の日本語の2つのドキュメントすら読まずに、
rails触っているエンジニアも、多いのが現状なので、
上の2つをしっかり読むだけで、意外と平均以上行ける気がします...
(真偽はわかりません)

いずれにしろ、Ruby on Railsは、
公式ドキュメントがしっかりしているので、
この点は大きな魅力ですね。

Docker環境でrails new

いよいよ、環境構築に入ります。

ローカルでrails newしてもいいのですが、
その場合、rbenvとかrailsとかインストールするものが、
多くなり、環境構築が煩雑になりがちです。
(加えてM1だとエラーが起こりがち)

railsはM1とかだと上手く動かなかったりするので、
Dockerでrails newを行います。

まずはDockerfileを作成します。

FROM ruby:3.0-alpine
RUN apk update && \
    apk upgrade && \
    apk add --no-cache gcompat && \
    apk add --no-cache linux-headers libxml2-dev make gcc libc-dev nodejs tzdata postgresql-dev postgresql git bash && \
    apk add --virtual build-packages --no-cache build-base curl-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
RUN apk del build-packages
ADD . /myapp
EXPOSE 4000
CMD ["rails", "server", "-b", "0.0.0.0"]

ドキュメントの内容を参考に修正しました。
https://docs.docker.jp/compose/rails.html

alpine系のイメージを使ったのと、
apk add --no-cache gcompat && \の部分は、
m1macに必要なので、入れております。

M1以外の人は、
省略して大丈夫です。

上記のDockerfileの大まかな処理内容としては、
必要なライブラリのインストールを行い、
GemfileとGemfile.lockをコンテナのディレクトリ内にコピーし、
bundle installコマンドを実行している感じです。

bundle installは、
railsで使うコマンドで、
必要なライブラリ(gem)をインストールするコマンドです。

あとは、rails serverという、
ローカルサーバーを立ち上げるコマンドをCMDに設定しています。

なお、Dockerの基本知識に不安がある人は、
下記の記事もご参考ください。

参考Dockerとは何か?概要を完全解説 簡単なWebサーバー構築で基礎を学ぶ

Dockerとは? Dockerは、コンテナ型仮想環境を作成するソフトウェアの一種で、隔離された実行環境を用意することが特徴です。 https://aws.amazon.com/jp/docker/ ...

続きを見る

GemfileとGemfile.lock

Dockerfileを記述したので、
次にGemfileを記載します。

rails7系にしたいので、

source 'https://rubygems.org'
gem 'rails', '~>7.0.3'

のようにします。

Gemfileのバージョンの記法ですが、
いくつかパターンがありまして、
上記の ~>のような場合だと、

7.0.3以上、7.1未満というように、
最終桁が繰り上がった数値未満という感じになります。

なので、
gem 'rails', '>=7.0.3', '<7.1'
と記載しても同じ意味になります。

Gemfileのバージョン指定の記法については、
ドキュメントとかのわかりやすい箇所に載っていないので、
混乱しがちですが、下記記事がわかりやすかったです。

https://autovice.jp/articles/118

ちなみに、Gemについては、
下記のようなGemの一覧サイトのようなものがあり、
バージョンを指定するのがよく分からなければ、
下記のサイトのサンプルコードをそのまま貼り付けるというやり方でも、
最初のうちは意外となんとかなります。

https://rubygems.org/

あと、そもそもバージョンを指定しないで、
インストールすることもできます。(推奨ではありませんが)

railsもgemの一種ですが、
railsのようにversionによって、
センシティブに挙動が変わるgemは、
バージョン指定にナーバスになるべきですが、
それ以外のgemとかだと、意外と、
バージョン指定なしで運用されていることもあります。

なので、最初のうちは、
そこまで神経質にならなくて大丈夫です。

さてGemfileがそんな感じでして、
次に、空のGemfile.lockも作成します。

Gemfile.lockは、JavaScriptにおける、
yarn.lockのようなインストールされているライブラリのバージョンを管理するファイルです。

基本的に手動では編集しません。
bundle installでインストールされると、
自動的に書き換えられます。

touch Gemfile.lock

docker-compose.yml作成とbuild

最後にdocker-compose.ymlを作成します。

version: '3.9'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 4000 -b '0.0.0.0'"
    stdin_open: true
    tty: true
    volumes:
      - .:/myapp
    ports:
      - "4000:4000"
    depends_on:
      - db

 これは、公式ドキュメントを参考にしている部分が多いです。

https://docs.docker.jp/compose/rails.html

ここまで来たら、
いよいよrails newします。

docker-compose run web rails new . --force --database=postgresql

新しいGemfileが作成されるので、
buildします。

docker compose build

 これで雛形ができますが、
DBの設定がまだなので、
そちらを行います。

database.ymlの設定とコンテナ立ち上げ

下記はrailsプロジェクト配下の
config/database.ymlというファイルです。

defaultで設定されている部分に、
DBのusernameやpasswordなどといったことを設定します。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

最後にコンテナを立ち上げます。

docker compose up -d

ただおそらく、これで、
localhost:4000にアクセスしても、
ActiveRecord::NoDatabaseErrorというエラーが出るかなと思います。

そのまんまのエラーなので、
DBを作成します。

docker-compose run web rails db:create

このあとは、出ない場合もありますが、
もし、pending migration errorというのが出たら、

docker-compose run web rails db:migrate

で治るかなと思います。

 

  • この記事を書いた人
  • 最新記事

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

おすすめ記事はこちら

Vim/Neovimプラグイン 1

プラグインをどれだけ入れるかは、その人の思想なども関係するので、一概にこれがいいというのはないかもしれません。 プラグインを全く入れない人もいれば、100個以上入れる人もいます。 ただそれでも、これだ ...

VimとNeovimの比較 2

本記事では、VimとNeovimの違いについて、解説します。 VimとNeovimの違いについては、普段頻繁にVimなどを使う方でなければ、正直、あまり気にしなくてもいいかなと思います。 ただ、Vim ...

Ruby変数やすべてがオブジェクトについて 3

本記事は、Rubyの基礎文法である、変数や真偽値、論理演算子に触れると同時に、「すべてがオブジェクト」というRubyの特徴的な思想についても解説します。 この思想は、Rubyの文法の根幹になっているの ...

4

エンジニアにおすすめの技術書 書籍学習は、エンジニアの嗜みみたいなところがありますが、 良書というものは、意外とそこまで多くもありません。 そこで本記事では「技術書マニアの筆者が厳選した技術書20選」 ...

5

エンジニアになるには? プログラミングは、専門性が高く自分一人で勉強するのが大変に感じることも多いですよね。 そこで本記事では「おすすめのプログラミングスクール5選」を特徴と、現役エンジニア目線で優れ ...

-バックエンド