【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 にブラウザでアクセスし、以下の画面が表示されれば成功です!
思いのほか簡単に作成することができました!macに環境を入れたくないという方は是非試してみてください!
この記事が気に入ったらサポートをしてみませんか?