DockerでRails6環境を作る

Docker で Rails6 の環境を作ったときのメモ。
商用で使うわけではなく、development 環境でしか使わないので、いろいろ足りないかもしれない。
なお環境は WSL2 で、事前に ruby2.7.2 と docker と docker-compose をインストールしてある。

[Dockerの公式ページ](https://docs.docker.com/samples/rails/)にある entrypoint.sh は使わない。
あと、個人的な好みで Docker Compose を使う。

# ファイルの準備

準備するのは以下の4つのファイル

### Dockerfile

apt-key はもうすぐ使えなくなるだろうが、今は気にしない。
nodejs のデフォルトのバージョンが 10.x なのだが、これだとこの後の Webpack のコンパイルで失敗する模様。
よって追加で 14.x をインストールする。

```Dockerfile:Dockerfile
FROM ruby:2.7.2

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -\
    && echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
RUN apt update -qq && apt install -y nodejs build-essential postgresql-client yarn \
    curl dirmngr apt-transport-https lsb-release ca-certificates

ENV APP_ROOT /app
RUN mkdir ${APP_ROOT}
WORKDIR ${APP_ROOT}
ADD ./Gemfile ${APP_ROOT}/Gemfile
ADD ./Gemfile.lock ${APP_ROOT}/Gemfile.lock

RUN bundle install

ADD . ${APP_ROOT}
```

### Gemfile

```Gemfile:Gemfile
source 'https://rubygems.org'
gem 'rails'
```

### Gemfile.lock

空ファイルを作る。

```text:Gemfile.lock
```

### docker-compose.yml

```yaml:docker-compose.yml
version: '3'
services:
  db:
    image: postgres:13.4
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=postgres
  web:
    build: .
    environment:
      RAILS_ENV: development
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - '3000:3000'
    depends_on:
      - db
```

# Railsアプリ作成

```shell
$ docker-compose build
$ docker-compose run --rm --no-deps web rails new . --force --database=postgresql
```

# 権限書き換え

私の場合、Dockerグループの設定などをしていないので、 rails new でファイルを作ると全部 root 権限になってしまう。
そこで sudo chown -R でファイルの所有者を自分に書き換えている。

```shell
$ sudo chown -R me.me *
```

# Railsの設定

```yaml:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db           # 追加(docker-compose.ymlのservicesに設定したのと同じ名前にする)
  username: postgres # 追加(docker-compose.ymlのPOSTGRES_USERに設定したのと同じ値にする)
  password: postgres # 追加(docker-compose.ymlのPOSTGRES_PASSWORDに設定したのと同じ値にする)
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
```
host, username, password の 3 行を追加する。username と password は docker-compose.yml で設定したものと合わせる。
いつ頃からか password を設定しないと怒られるようになった。


# DB作成

```shell
$ docker-compose run --rm web rake db:create
```

# 起動

```shell
$ docker-compose up
```

# DBマイグレーション

## Scaffold

```shell
$ docker-compose run --rm web rails g scaffold User name:string height:integer weight:integer
```

ここでも出来るファイルは root 権限になってしまうので、sudo chown -R でファイルの所有者を自分に書き換える。

## Migration

```shell
$ docker-compose run --rm web rake db:migrate
```
# Permission denied のエラーが出たら

```
db_1   | 2021-08-22 10:35:11.953 UTC [31] WARNING:  could not open statistics file "pg_stat_tmp/global.stat": Permission denied
```

みたいな感じで Permission denied のエラーが出ることがある。
そのときは sudo chown -R me.me * で権限を自分に書き換える。
めんどうなのですべてのファイルの権限を書き換えている。

# OCI runtime create failed のエラーが出たら
```
ERROR: for rails_db_1  Cannot start service db: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting "/run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/Ubuntu-20.04/b90b8fe5c1b58941ad8f1d946593e332a8ad2a209d955b5b9babc4dea8a62ea9" to rootfs at "/var/lib/postgresql/data" caused: mount through procfd: no such file or directory: unknown
```
理由は分からないがこのエラーが出たら WSL を再起動すると直るようだ。

# Webpacker::Manifest::MissingEntryError が出たら

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/ff5593cb-fc64-5935-bf31-5dc546bb3e17.png)

`Webpacker::Manifest::MissingEntryError in Users#index`
みたいなエラーが出たときに以下をやったら直る。

```shell
$ docker-compose run --rm web rake webpacker:install
$ docker-compose run --rm web rake webpacker:compile
```

# Rails7 の環境も作った

https://qiita.com/mkt1234/items/b852eeeb213e46702236