Dockerを使ってRails6環境の構築をしてみる

Rails6のリリースがされていたので、自身のPCに環境を作ってみた。

#### (環境)
Mac(Mojave 10.14.6)

#### (参考)
https://docs.docker.com/compose/rails/#define-the-project
に沿って実施。
実施の時は5系の記載だったので、6に置き換えて行う。

# 1.Docker for Macのインストール
（インストール済みならスキップ）
https://docs.docker.com/compose/install/

# 2.Rails / PostgreSQLアプリケーションを設定
Docker Composeを使用してRails / PostgreSQLアプリケーションを設定する。

## 2-1.プロジェクト定義
開発していくディレクトリにアプリケーションを構築するために必要な4つのファイルを設定する。
・Dockerfile
・Gemfile
・Gemfile.lock
・entrypoint.sh
・docker-compose.yml

*今回はPC内のUserフォルダ配下に作成
*プロジェクト名をmyappとして設定

```console
$ mkdir myapp
$ cd myapp
```

```ruby:Dockerfile
FROM ruby:2.6.6

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

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client yarn
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# 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

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
```
* Rails6でwebpackerが搭載され、yarnのインストールが必要になったので追記  
(参考)https://yarnpkg.com/en/docs/install#debian-stable

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

```ruby:Gemfile.lock(空のファイル)

```

```ruby: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 "$@"
```

```ruby:docker-compose.yml
version: '3'
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
```

## 2-2.プロジェクトの構築
作成した5つのファイルを利用してdocker-compose runを実行し、アプリケーションを生成する。(ターミナルを使って実施)

```console
$ docker-compose run web rails new . --force --no-deps --database=postgresql
:
:
:
最後にWebpackerのインストール成功メッセージが表示される
Webpacker successfully installed 🎉 🍰
```


アプリケーション生成後は、以下を実施する。

```console
$ docker-compose build
:
:
:
最後に下記のようなSuccess情報が表示される
Successfully built aa99bbad99f9
Successfully tagged myapp_web:latest
```

## 2-3.データベースの設定と作成
データベースの情報を設定するために、**config/database.yml**を変更し、コマンドでDBを作成する。

```config/database.yml
# 設定箇所のみ抜粋
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password # docker-compose.ymlのPOSTGRES_PASSWORDで指定した値
  pool: 5
:
:
development:
  <<: *default
  database: myapp_development
:
:
test:
  <<: *default
  database: myapp_test
```


データベースを作成する

```console
$ docker-compose run web rake db:create

# 作成が成功すると、以下のコマンドが表示される。
Starting myapp_db_1 ... done
Created database 'myapp_development'
Created database 'myapp_test'
```

## 2-4.dockerを起動
dockerを起動し、ローカル環境のページにアクセスする。

```console
docker-compose up
```

実行すると以下のコマンドが表示される。

```console
myapp_db_1 is up-to-date
Starting myapp_web_1 ... done
Attaching to myapp_db_1, myapp_web_1
:
:
web_1  | => Booting Puma
web_1  | => Rails 6.0.3.2 application starting in development
web_1  | => Run `rails server --help` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 4.3.5 (ruby 2.6.6-p146), codename: Mysterious Traveller
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop
```

**http://localhost:3000**にアクセスして、ようこそページが表示されれば、構築完了。
<img width="850" alt="スクリーンショット 2020-06-23 20.32.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248644/f9cedd13-8475-39fd-828a-27e443a549e5.png">



# その他(アプリケーションの停止)
アプリケーションの停止はプロジェクトディレクトリでdocker-compose downを実行する。

・別のターミナルウィンドウを表示し、プロジェクトディレクトリから実施

```console
$ docker-compose down
Stopping myapp_web_1 ... done
Stopping myapp_db_1  ... done
Removing myapp_web_run_b13a7c5899a1 ... done
Removing myapp_web_1                ... done
Removing myapp_web_run_5ad07400cf63 ... done
Removing myapp_db_1                 ... done
Removing network myapp_default
```

・downするともう一つのターミナル(docker-compose upした側)も停止の実行結果が表示される

```console
web_1  | - Gracefully stopping, waiting for requests to finish
web_1  | === puma shutdown: 2019-08-25 23:58:46 +0000 ===
web_1  | - Goodbye!
web_1  | Exiting
myapp_web_1 exited with code 1
db_1   | 2019-08-25 23:58:47.254 UTC [1] LOG:  received smart shutdown request
db_1   | 2019-08-25 23:58:47.278 UTC [1] LOG:  background worker "logical replication launcher" (PID 28) exited with exit code 1
db_1   | 2019-08-25 23:58:47.279 UTC [23] LOG:  shutting down
db_1   | 2019-08-25 23:58:47.353 UTC [1] LOG:  database system is shut down
myapp_db_1 exited with code 0
```

# 履歴
## 20200622
再度構築してみたら、以下のエラーとなったので構築方法を修正、反映した。

```
PG::ConnectionBad: could not translate host name "db" to address: Name or service not known
```
- postgresコンテナに環境変数POSTGRES_PASSWORDを設定
- 設定した値をconfig/database.ymlのpasswordに定義

**参考にした記事**
https://qiita.com/at-946/items/2fb75cec5355fad4050d

## 20200623
バージョンを指定するように修正
ruby:2.6.6
gem 'rails', '6.0.3'