docker-composeでRails5.2開発環境

あちこちで解説されているdocker(compose)でRails5.2(+PostgreSQL)のサーバを立ち上げる方法です。[Docker Desktop](https://docs.docker.com/docker-for-mac/install/)を予めインストールしておいてください（docker-composeは含まれています）。

今更な感じもありますし、これが正解ではないと思いますが、[公式の手順](https://docs.docker.com/compose/rails/)を参考に可能な限りコマンドをシンプルにしてみました。運用していく上で結局元に戻す（コマンドを足す）可能性もありますが、まず起動して動かしてみるために[公式の手順](https://docs.docker.com/compose/rails/)は色々やりすぎている気がしたので、極力絞った構成にしています。

（6系はyarnとwebpacker周りが複雑でまだ敬遠していますが…一応やってみました -> [記事](https://qiita.com/lumbermill/items/873f5bf22d091b828c45)）

## インストール
まず必要なファイルは2つだけです。

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
  web:
    build:
      context: .
      dockerfile: docker-web
    command: "rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/railsapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

```docker:docker-web
FROM ruby:2.6.6

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN gem install rails -v "~> 5.2" -N

RUN mkdir /railsapp
WORKDIR /railsapp
COPY . /railsapp
# 後で有効化
# RUN bundle install  
```

上記２つのファイルを置いたディレクトリで新規プロジェクトを作成します。

```bash
docker-compose run web rails new . --database=postgresql
```

少し時間がかかりますが、rails関連の新しいファイルが生成されています。

<img width="204" alt="Screen Shot 2020-08-07 at 22.38.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50780/b9ef0852-c39f-fa95-be77-f088cb8f017f.png">

Docker環境ではデータベースはlocalhostには存在しないため、composerで作った db に接続するよう設定を変更します。

```ruby:railsapp/config/database.yml
host: db
username: postgres
password: secret
```

次に Dockerfile の `RUN bundle install` の行を有効にし（コメントを外し）、buildを実行します。

```bash
docker-compose build
docker-compose up
```

ここまでで、Webサーバが立ち上がった状態になっていますが、データベースの初期化が必要です。別のターミナルを立ち上げて以下を実行します（execはコンテナが立ち上がった(=upされた)状態でコマンドを実行するサブコマンドです）。

```bash
docker-compose exec web rails db:create
```

ここまで実行したらブラウザで「localhost:3000」にアクセスするとRailsの最初のページが見えているはずです。

![Screen Shot 2020-02-11 at 21.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50780/e4ccc79a-5e9e-3af7-3a22-7326bf8518ba.png)

同じ要領で、scaffoldを作成したり、ここからはいつものrailsのノリで作業が出来そうです（先頭の`docker-compose exec web`を外すと普通のRailsコマンドです）。

```bash
docker-compose exec web rails g scaffold post title:string body:text published:boolean
docker-compose exec web rails db:migrate
```

![Screen Shot 2020-02-11 at 21.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50780/ae962dac-94c1-c5fb-e153-2ef85fb252ec.png)

## 補足1
デフォルトのGemfileは、bundle install後に色々警告が出てしまいます。警告の内容に従って新しいgemに差し替えています。

```ruby:Gemfile
# gem 'sass-rails', '~> 5.0'
# ↓ 変更
gem 'sassc-rails'

# gem 'chromedriver-helper'
# ↓ 変更
gem 'webdrivers'
```

開発がDocker(linux)ならWindowsのお世話になることはありませんので、以下は削除してしまいます。[参考記事](https://qiita.com/tatama/items/3f0f5e42cb5f75b53817)

```
# 削除
# gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

rubyの2.7を使いたかったのですが、Pumaの起動時に警告が大量に出るため、2.6を使用しています。

```
/usr/local/bundle/gems/activemodel-5.2.4.1/lib/active_model/translation.rb:67: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
```

## 補足2
dockerは"軽量"と言われていますが、何回も試していると意外とディスクを圧迫してきます。時々不要なものは削除すると良いでしょう。以下は**開発環境で**がさっと削除する場合の例です。

```
$ docker ps -a | awk '{print $1}' | xargs docker rm
$ docker images | grep none | awk '{print $3}' | xargs docker rmi
```

- [docker imageを一括で整理したい](https://qiita.com/naa0yama/items/375d926019e283c69bd0)
- [containerとimageをまとめて削除](https://qiita.com/masayuki_oguni/items/f3f180454343566d8d3a)

2020.08.12追記
以下のコマンドも役に立ちます [参考記事](https://qiita.com/shinespark/items/526b70b5f0b1ac643ba0)

```
docker system prune
```

## 補足3
元々は、railsプロジェクトはrailsappサブディレクトリに収める作りにしていたのですが、heroku+githubの連携と相性が悪かったため、プロジェクト直下に配置するように調整しています。

## 関連記事

- [Rails5.2で色々やってみる](https://qiita.com/lumbermill/items/5a94264eb3888bf0c133)
- [Rails5.2でStripeを使う](https://qiita.com/lumbermill/items/5be5dee3bf646c07e47c)
- [docker-composeでRails6開発環境](https://qiita.com/lumbermill/items/873f5bf22d091b828c45)