【Rails環境構築】Mac × Docker

今日はrailsの環境をDockerで作っていきたいと思います!
railsの環境構築はしたいけど、macに直接入れたくない!(使用しなくなった際に削除がめんどいなど)という方の参考になれば幸いです。

この記事のゴール

Dockerでrailsが起動できるようになります。

環境情報

・Mac Book Air (2018)
・macOS Big Sur

参考URL

docker公式のQuickStart (以下ではQuickStartと呼びます)

前提

Quick Startではpostgres sqlを使用するようになっていますが、今回はsqliteを使用した環境作りを行います。

1. 作業用フォルダを作成

私の環境ではデスクトップにsample_railsというフォルダを作成します。

$ mkdir sample_rails
$ cd sample_rails

2. Dockerfileの作成

1で作成したsample_railsというフォルダにDockerfileを作成します。
今回はQuickStartの内容と同じとします。

$ vi Dockerfile
ファイルが開いたら以下を記述

# syntax=docker/dockerfile:1
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs
RUN mkdir -p /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
# bundle installしたら勝手に作成されるので作らない
# COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]

3. gemファイルの作成

railsのアプリに入れるgemを記載するファイルを作成します。
今回はrailsのバージョンは5を使用します。
Quick Startではこの後にGemfile.locを作成しますが、bundle installすると勝手に作成されるので作成しません。

$ vi Gemfile

# ファイルが開いたら以下を記載
source 'https://rubygems.org'
gem 'rails', '~>5'

# sqliteを使用したいので追記(Quick Startではpostgresを使用します)
gem 'sqlite3'

4. entrypoint.shの作成

Dockerfile内で呼び出すシェルを作成します。
このシェルでpidが存在する場合は削除したり、Dockerfile内からrailsサーバーを起動します。

$ vi entrypoint.sh

# ファイルが開いたら以下を記載

#!/bin/bash
# エラーが起きたら処理を中断
set -e

# pidが存在する場合は削除
rm -f /myapp/tmp/pids/server.pid

# Docker起動、引数はDockerfile内から渡される
exec "$@"

5. docker-compose.ymlの作成

Dockerの起動やコンテナの作成を容易に行えるように作成します。

$ vi docker-compose.yml

# ファイルが開いたら以下を記載

version: "3.9"
services:
 # 今回はpostgresを使用しないので、コメントアウト
 # 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 3000 -b '0.0.0.0'"
   volumes:
     - .:/myapp
   ports:
     - "3000:3000"
   # depends_on:
   #   - db

6. Railsプロジェクトの作成

これまで作成したファイルを使用して railsのプロジェクトを作成(rails new)します。
sample_appフォルダに入っていることを確認し、以下のコマンドを実行します。
コマンド実行後と比較するために、現在のフォルダ構成を確認しておきます。

$ ls -la

sample_rails % ls -la
total 24
drwxr-xr-x@  5 xxx  staff  160  5  4 10:23 .
drwx------@ 15 xxx  staff  480  5  2 19:13 ..
-rw-r--r--   1 xxx  staff  528  5  2 19:18 Dockerfile
-rw-r--r--   1 xxx  staff   49  5  4 10:11 Gemfile
-rw-r--r--   1 xxx  staff  423  5  4 10:23 docker-compose.yml
-rw-r--r--   1 xxx  staff  200  5  4 10:33 entrypoint.sh
sample_rails %

コマンドを実行

# --force 既存のgemfileを上書き
$ docker-compose run web rails new . --force

実行後ディレクトリを確認

sample_rails % ls -la
total 96
drwxr-xr-x@ 25 xxx  staff   800  5  4 10:34 .
drwx------@ 15 xxx  staff   480  5  2 19:13 ..
drwxr-xr-x  10 xxx  staff   320  5  4 10:34 .git
-rw-r--r--   1 xxx  staff   695  5  4 10:34 .gitignore
-rw-r--r--   1 xxx  staff    10  5  4 10:34 .ruby-version
-rw-r--r--   1 xxx  staff   521  5  4 10:32 Dockerfile
-rw-r--r--   1 xxx  staff  2196  5  4 10:34 Gemfile
-rw-r--r--   1 xxx  staff  5230  5  4 10:34 Gemfile.lock
-rw-r--r--   1 xxx  staff   374  5  4 10:34 README.md
-rw-r--r--   1 xxx  staff   227  5  4 10:34 Rakefile
drwxr-xr-x  10 xxx  staff   320  5  4 10:34 app
drwxr-xr-x   9 xxx  staff   288  5  4 10:34 bin
drwxr-xr-x  16 xxx  staff   512  5  4 10:34 config
-rw-r--r--   1 xxx  staff   130  5  4 10:34 config.ru
drwxr-xr-x   3 xxx  staff    96  5  4 10:34 db
-rw-r--r--   1 xxx  staff   427  5  4 10:31 docker-compose.yml
-rw-r--r--   1 xxx  staff   200  5  4 10:33 entrypoint.sh
drwxr-xr-x   4 xxx  staff   128  5  4 10:34 lib
drwxr-xr-x   3 xxx  staff    96  5  4 10:34 log
-rw-r--r--   1 xxx  staff    63  5  4 10:34 package.json
drwxr-xr-x   9 xxx  staff   288  5  4 10:34 public
drwxr-xr-x   3 xxx  staff    96  5  4 10:34 storage
drwxr-xr-x  11 xxx  staff   352  5  4 10:34 test
drwxr-xr-x   6 xxx  staff   192  5  4 10:34 tmp
drwxr-xr-x   3 xxx  staff    96  5  4 10:34 vendor

7. bundle installを行う

rails newした際に、3で作成したGemfileが上書きされ内容が変わっているのでbundle installを行います。

$ docker-compose build

8. コンテナを起動

準備が整ったので、railsサーバーを起動します!

# バックグランドで起動したいので、-d を指定
$ docker-compose up -d

コンテナが起動したら http://localhost:3000 にブラウザでアクセスし、以下の画面が表示されれば成功です!

画像1

思いのほか簡単に作成することができました!macに環境を入れたくないという方は是非試してみてください!

この記事が気に入ったらサポートをしてみませんか?