Rails(6.02) + PostgreSQL(12.2) の環境をdocker-composeで作成する（webpacker対応版）

# はじめに
[Rails\+PostgreSQLの環境をdocker\-composeで作成する \- Qiita](https://qiita.com/atizawa/items/4ca6306087e3813b0941#comment-1b1b3fbc70a8f04f268d)で紹介されている方法はRails5での動作を前提としているようでした。
Rails6のwebpackerまわりの記述を追加し、アップデートしたのがこの記事になります。

## Version
- Ruby 2.7.0
- Rails 6.0.2 （Dockerfileでバージョン固定します）
- PostgreSQL 12.2

# ファイル構成

[元記事](https://qiita.com/atizawa/items/4ca6306087e3813b0941#comment-1b1b3fbc70a8f04f268d)におなじです。

```
./
|- app/  //共有フォルダ
|- docker-compose.yml
|- web/
   |- Dockerfile
```

# Dockerfileの作成

```Dockerfile:Dockerfile
FROM ruby:2.7.0

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get install -y build-essential libpq-dev postgresql-client \
  && apt-get install -y nodejs yarn

RUN gem install rails -v "6.0.2"
RUN mkdir /app
WORKDIR /app
```


### Dockerfileの変更点

* Rubyのバージョンアップ `FROM ruby:2.7.0`
* Railsのバージョン固定 `RUN gem install rails -v "6.0.2"`
    * 元記事でもおなじようにバージョン固定(`-v "5.2.3"`とか）すればそのまま使えるはず（未調査）
* webpacker用のライブラリ（yarnとnodejs）の追加 

```Dockerfile:yarnとnodejsの追加部分
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get install -y nodejs yarn
```

# docker-compose.ymlの作成


```yaml:docker-compose.yml
version: "3"

services:
  web:
    build: web
    ports:
      - "3000:3000"
    environment:
      - "DATABASE_HOST=db"
      - "DATABASE_PORT=5432"
      - "DATABASE_USER=postgres"
      - "DATABASE_PASSWORD=admin"
    links:
      - db
    volumes:
      - "./app:/app" #共有フォルダの設定
    stdin_open: true

  db:
    image: postgres:12.2
    ports:
      - "5432:5432"
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=admin"
```

### docker-compose.ymlの変更点

* postgreSQLのバージョンアップ `image: postgres:12.2`


# コンテナを起動する

```
docker-compose build
docker-compose up -d
```
# コンテナにログインし、Railsアプリを作成

```console
docker-compose exec web bash
rails new <アプリ名> -d postgresql -BT
```

# Gemfile

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

ruby '2.7.0'

gem 'rails', '~> 6.0.2'
gem 'pg', '>= 0.18', '< 2.0'
gem 'puma', '~> 4.1'
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'bootsnap', '>= 1.4.2', require: false

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

# config/database.yml

アプリ名は「yay」にしています。

```yml:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>
  port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>
  username: <%= ENV.fetch('DATABASE_USER') { 'root' } %>
  password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %>
  
development:
  <<: *default
  database: yay_development

test:
  <<: *default
  database: yay_test

production:
  <<: *default
  database: yay_production
  username: yay
  password: <%= ENV['YAY_DATABASE_PASSWORD'] %>
```

# Railsアプリを起動する
作成したアプリのディレクトリに移動して、もろもろのセットアップをおこなえばアプリが起動できるはずです :smile: 

```console
cd <アプリ名>
bundle install
rails webpacker:install
rails db:create
rails db:migrate
rails s -b 0.0.0.0 -d 
```

# サンプルレポジトリ
https://github.com/hirocueki/docker-rails