【Rails6】Dockerによる開発環境構築

#はじめに

先日開発環境にDockerを導入しましたが、記事に書いてあるコードをほとんど模写したような状態であったため、本日改めてコードの意味を確認するため、記述していきます。

なお、環境構築を行うにあたり、参考にさせて頂いた記事は以下です。

[docker　ruby(2.6.5)・mysql(5.6.47)・rails(6.0.0)の開発環境構築](https://qiita.com/Tomohisa_koyama/items/5f2d32fd0677aa244b72)
[既存のRailsアプリの開発環境にDockerを導入する手順【Rails, MySQL, Docker】](https://qiita.com/DaichiAndoh/items/66bf631f72698b5c2a53)
[Docker + rails6 + MySQL + bootstrap,jqueryまで環境構築完全ロードマップ](https://qiita.com/rakko1124/items/ff698a966b94ebe8aa7e)
[Docker公式:Railsクイックスタート](https://docs.docker.com/compose/rails/)

本当にありがとうございました🙇‍♂️🙇‍♂️🙇‍♂️

#環境
Ruby on Rails '6.0.0'
Ruby '2.6.5'
MySQL '5.6.47'

#Dockerfile

まずコマンドについて整理しておきます。

| コマンド | 意味 |
|:-:|:-:|
|FROM   | ベースイメージの指定  |
|RUN   |コマンドの実行、パッケージのインストールなどで使用   |
|WORKDIR   |作業ディレクトリの変更、cdのイメージ   |
|COPY   |指定したファイル・ディレクトリをコンテナ内にコピー   |
|ENTRYPOINT   |docker run時に実行されるコマンド   |
|EXPOSE   |公開するポートの指定   |
|CMD   |docker run時に実行されるコマンド   |



```ruby:Dockerfile
FROM ruby:2.6.5
#アプリケーションのrubyのversionを記述。

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 \
    && mkdir / myapp
#Docker環境に必要なパッケージをインストール。Rails6の場合、webpackerが標準になったため、yarnのインストールも行う。

WORKDIR / myapp
#上記のmkdirで作成されたディレクトリへ移動
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
#GemfileとGemfile.lockをコンテナ内にコピー
RUN gem install bundler
RUN bundle install
#bundlerをインストールし、bundle installを実行。
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
#entrypoint.shを呼び出し、実行。entrypoint.shについては後ほど記述していきます。

CMD ["rails", "server", "-b", "0.0.0.0"]
#「rails s」のイメージ
```

#entrypoint.sh

```ruby:entrypoint.sh
set -e
#エラーが発生するとスクリプトが終了される

rm -f /myapp/tmp/pids/server.pid
#railsのserver.pidを削除

exec "$@"
#CMDで渡されたコマンドを実行している
```

↓Docker公式よりentrypoint.shについて引用↓
「次に、特定のserver.pidファイルが存在する場合にサーバーが再起動しないようにするRails固有の問題を修正するためのエントリポイントスクリプトを提供します。このスクリプトは、コンテナが起動するたびに実行されます。 entrypoint.shで構成されています：」

#docker-compose.yml

```ruby:docker-compose.yml
version: '3'
#docker-composeのバージョンを指定
services:
  db:
    image: mysql:5.6.47
#使用するイメージを指定
    environment:
      MYSQL_ROOT_PASSWORD: password
#mysqlのパスワードを指定。環境変数を定義
    ports:
      - '3306:3306'
#ポート番号の指定。[ホスト：コンテナ]で設定
    volumes:
      - mysql-data:/var/lib/mysql
#データの永続化が可能に。ディレクトリのマウント設定
  web:
    build: .
#Dockerfileがあるパス
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
#server.pidを削除してから、rails sを実行するコマンド
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
#依存関係を設定
    stdin_open: true
    tty: true
#この2つを指定しないと、コンテナが起動してもすぐ終了してしまうらしい
```

#database.yml

```ruby:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: db
  socket: /tmp/mysql.sock
```
Railsはデフォルトでhost:localhostになるため、
hostを先ほど作成したdbに変更する。

#コンテナの起動

```ruby:ターミナル
% docker-compose build
% docker-compose up -d
% docker-compose exec web rails db:create
% docker-compose exec web rails db:migrate
```

#おわりに

Docker公式などを翻訳しながら調べてみたので、間違えている箇所ありましたら、ご教授ください。。。