DockerでRailsの環境構築

アウトプットの練習 & 初心に帰って基礎からRailsを見直してこうと思います。
不定期に更新します。

今回はRuby on Railsの環境構築。

今回はDockerでRailsチュートリアルを進めていくためのRailsプロジェクトを作ります。
[rbenv]([https://github.com/rbenv/rbenv](https://github.com/rbenv/rbenv))などを用いたローカルでの環境構築ではないです。

## 前置き

### 前提として...

- 以下の場合はローカルでの環境構築を勧めます
  - railsの環境構築1度もしたことない
  - dockerを使った開発をしたことがない(Dockerfileの記述がわからない)

### アプリケーション要件

- ruby 2.6.5
- rails 6.2.0
- sqlite3
- webpacker、springはとりあえず不要なので除く

すごいざっくりですが、こんなイメージ、コンテナを作るのがゴールです。

## レッツ環境構築

### STEP1 rails newコマンドまでの準備

PJ用のディレクトリを作成してその中で作業していきます。

まずは必要になるファイルを用意しましょう。

`touch Dockerfile docker-compose.yml Gemfile Gemfile.lock .gitignore`

```ruby:Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.5'

gem 'rails', '~> 6.0.2', '>= 6.0.2.1'

```

```docker:Dockerfile
FROM ruby:2.6.5-alpine

ENV LANG="C.UTF-8" \
    PACKAGES="curl-dev build-base alpine-sdk tzdata sqlite-dev less ruby-dev nodejs"

RUN apk update && \
    apk add --no-cache --update $PACKAGES

WORKDIR /var/www

COPY ./ ./

RUN gem install bundler && \
    bundle install -j4

EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]

```

```yml:docker-compose.yml
version: '3'
services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    volumes:
      - ./:/var/www
    ports:
      - "3000:3000"
    tty: true
    stdin_open: true
    restart: always

```

```.gitignore:.gitignore
# Ignore bundler config.
/.bundle

# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
/db/*.sqlite3-*

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore uploaded files in development.
/storage/*
!/storage/.keep

/public/assets
.byebug_history

# Ignore master key for decrypting credentials and more.
/config/master.key

.idea
.vscode
.DS_store

```

一旦ここまで作ってしまいます。
(.gitignoreはお好みあれば)

ここまで作ったらイメージを作成します。
`docker-compose build`

### STEP2 Railsプロジェクトの作成、微修正

buildが完了したら、いよいよRailsプロジェクトを作成します。

`-d sqlite -> 使用DBをsqlite3を選択`
`-B -> プロジェクト作成後のbundle installをしない(修正するからスキップで)`
`--skip-webpack-install -> プロジェクト作成後のwebpacker:installをしない`
`--skip-spring -> プロジェクト作成後のspringのinstallをしない`

`docker-compose run --rm app rails new -d sqlite3 -B --skip-webpack-install --skip-spring .`

コマンド実行すると、いくつかのファイルがもう存在するけどどうする〜？みたいに聞かれます。
.gitignoreファイルは上書きなし、Gemfileは上書きしてしまいましょう。

```
    conflict  .gitignore
Overwrite /var/www/.gitignore? (enter "h" for help) [Ynaqdhm] n
        skip  .gitignore
    conflict  Gemfile
Overwrite /var/www/Gemfile? (enter "h" for help) [Ynaqdhm] Y
       force  Gemfile
```

Gemfileにあるwebpackerの記述を消しましょう

```ruby:Gemfile
# 下記二行を削除
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
```

サーバー立ち上げた後にsw.jsが無いとエラーを吐きまくるので仮で作っておきましょう。
`touch public/sw.js`

ここまでくればもう少し、bundle installとdbの作成、マイグレーションを実行します。

その前にgemを更新するため、再度ビルドしてあげましょう。

`docker-compose build`

`docker-compose run --rm app rails db:create`

`docker-compose run --rm app rails db:migrate`

### STEP3 Railsプロジェクトの起動

あとはコマンド一つでRailsサーバーが立ち上がります。
`docker-compose up -d`

http://localhost:3000 で立ち上がるのを確認しましょう。

<img width="899" alt="hello Rails" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166596/a52ab1f9-a418-7c38-0885-0b80d6d28e5b.png">

やったぜ。

## 終わりに

出来上がりのソースコードは[こちら](https://github.com/fussy113/RailsTutorial)に置いてあります。(変更あるかもしれませんが)

RubyMineを最近購入したのでこれからウッキウキでコード書こうと思います。

Railsに関しての記事をこれから不定期ですが粛々とアップしていきますのでよければ！