サクッとRailsの開発環境をDockerで構築してみる

## 環境

- macOS Catalina 10.15.6
- Docker 20.10.10
- docker-compose 2.1.1

## DockerでRailsの開発環境を構築する

公式ドキュメントを参考にDockerでRailsの開発環境を構築する。
[Quickstart: Compose and Rails](https://docs.docker.com/samples/rails/)

### ファイルを作成する

以下のファイルを作成する。

```bash
$ mkdir hello_app/
hello_app$ cd hello_app
hello_app$ touch Dockerfile
hello_app$ touch docker-compose.yml
hello_app$ touch Gemfile
hello_app$ touch Gemfile.lock
```

```docker:Dockerfile
# syntax=docker/dockerfile:1
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

# 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"]
```

```yaml:docker-compose.yml
version: "3.9"
services:
  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
```

```bash:Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5'
```

Gemfile.lockは空のまま。

```Gemfile.lock

```

```bash:entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

### プロジェクトを作成する

```bash
hello_app$ docker-compose run --no-deps web rails new . --force --database=postgresql
hello_app$ ls -ltotal 80
-rw-r--r--   1 {name}  staff   483 11 14 20:15 Dockerfile
-rw-r--r--   1 {name}  staff  2214 11 14 20:27 Gemfile
-rw-r--r--   1 {name}  staff  5236 11 14 20:27 Gemfile.lock
-rw-r--r--   1 {name}  staff   374 11 14 20:27 README.md
-rw-r--r--   1 {name}  staff   227 11 14 20:27 Rakefile
drwxr-xr-x@ 10 {name}  staff   320 11 14 20:27 app/
drwxr-xr-x@  9 {name}  staff   288 11 14 20:27 bin/
drwxr-xr-x@ 16 {name}  staff   512 11 14 20:27 config/
-rw-r--r--   1 {name}  staff   130 11 14 20:27 config.ru
drwxr-xr-x@  3 {name}  staff    96 11 14 20:27 db/
-rw-r--r--   1 {name}  staff   358 11 14 20:27 docker-compose.yml
-rw-r--r--@  1 {name}  staff   201 11 14 20:24 entrypoint.sh
drwxr-xr-x@  4 {name}  staff   128 11 14 20:27 lib/
drwxr-xr-x@  3 {name}  staff    96 11 14 20:27 log/
-rw-r--r--   1 {name}  staff    63 11 14 20:27 package.json
drwxr-xr-x@  9 {name}  staff   288 11 14 20:27 public/
drwxr-xr-x@  3 {name}  staff    96 11 14 20:27 storage/
drwxr-xr-x@ 11 {name}  staff   352 11 14 20:27 test/
drwxr-xr-x   6 {name}  staff   192 11 14 20:27 tmp/
drwxr-xr-x@  3 {name}  staff    96 11 14 20:27 vendor/
```

### DBの設定を変更する

config/database.yml を以下の内容で書き換える。

```yaml:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test
```

### DBを作成する

```bash
hello_app$ docker-compose run web rake db:create
[+] Running 1/0
 ⠿ Container hello_app-db-1  Running                                          0.0s
Created database 'myapp_development'
Created database 'myapp_test'
```

### アプリケーションを起動する

```bash
hello_app$ docker-compose build
hello_app$ docker-compose up
```

### 画面を確認する

[http://localhost:3000/](http://localhost:3000/) をブラウザから閲覧する。

以下の画面が表示されれば成功です。

![スクリーンショット 2021-11-14 20.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217116/3d376d89-e8dd-3a76-1c2e-fe267f228135.png)

### PG:ConnectionBadと怒られたら
![スクリーンショット 2021-11-14 20.34.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217116/9a1a5f0e-e848-c20c-ce86-8845a7c71ec5.png)

DBを作成出来ていない可能性があるので作成する。

[DBを作成する](#dbを作成する)