Docker+Rails6+MySQLで環境構築をして爆速で投稿機能を作る。

今回は投稿機能をRails6の新機能であるScaffoldを使って投稿機能を作る＋環境構築をやっていきたいと思います。

#まずは環境構築から。

手始めにターミナルで

```
mkdir sampleApp
```
と打ってください。
ちなみにsampleAppの部分は便宜上入れただけなので、好きななまえで大丈夫です。ただし英語のほうがベター

その後に

```
cd sampleApp
```
で自分の作ったディレクトリに移動してください。

移動したら

```
vi Dockerfile
```
![スクリーンショット 2021-05-18 17.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998838/e2eb250b-eb94-c2c9-63aa-251bc5b07864.png)


というコマンドを打つと上の画面のようになり、ターミナル上でDockerfileを編集することができます。
わざわざテキストエディタを開かなくても大丈夫というメリットがあります。

そしたら、


```
FROM ruby:2.6.5

# 必要なパッケージのインストール（基本的に必要になってくるものだと思うので削らないこと）
RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \
                       imagemagick
                      
# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
  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 && apt-get install -y yarn
  
# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
  apt-get install nodejs        

# 作業ディレクトリの作成、設定
RUN mkdir /app_name 
##作業ディレクトリ名をAPP_ROOTに割り当てて、以下$APP_ROOTで参照
ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

# ホスト側（ローカル）のGemfileを追加する（ローカルのGemfileは【３】で作成）
ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

# Gemfileのbundle install
RUN bundle install
ADD . $APP_ROOT
```

とコピペして入力してください。ただ、Railsのバージョン自体は自由に変えていただいても大丈夫です。
そうしたら`：ｗｑ`で上書き保存をしてください。

そしたら次に

```
vi Gemfile
```

でGemfileを作成・へんしゅうしてください。

それでその中に

```
source 'https://rubygems.org'
gem 'rails', '6.0.0'
```
を入れて`：ｗｑ`で上書き保存をしてください。

次に、`touch`コマンドでGemfile.lockを作成します。

こんな感じです。

```
touch Gemfile.lock
```

次に、docker-compose.ymlを作成します。

```
vi docker-compose.yml
```
でdocker-compose.ymlというファイルが自動で生成されて自動で編集画面に行けるので、そうしたら

```
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"

  web:
    build: .
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    links:
      - db
```

myaqlのあとの5.7の部分はバージョンを指定しているのですが、使いたいバージョンを自由に指定してください。
のコマンドを実行した後`:wq`コマンドで上書き保存してください。
そうしたら

```
docker-compose run web rails new . --force --database=mysql --skip-bundle
```
というコマンドでMySQLを使ったRailsのアプリケーションができます。

次に、databese.ymlを編集していきます。
今回作ったアプリとアプリの中のデータベース(MySQLで構成された)と接続するための設定ファイル。

まずは

```
cd config
vi database.yml
```

を上から順番に実行してください。
そしたらdatabase.ymlが編集できる画面にいけますのでそこで

```
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: localhost
```

となっている部分がありますので、それを

```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
```
に変更してください。
encodingの部分をutf8にしないと文字数の制限があるので投稿しようとしてMySQLに接続した際にエラーが起きてしまいます。
passwordの部分を設定することで、docker-compose.ymlの部分のMySQLにRoot権限で接続するときのパスワードを設定します。
hostの部分を設定することで、MySQLが動作しているホスト名を設定します。今回はdbに変えます。

そうしたらESCコマンドを押して半角英数で`:wq`と入力して上書き保存をします。

そうしたら、先程書いたDockerfileとdocker-compose.ymlの設定を反映した状態でコンテナをビルドしていきます。

```
docker-compose build
```

これでしばらく待ちましょう。
これでもし以下のエラーが出たら

```
Could not find gem 'mysql2 (>= 0.4.4)' in any of the gem sources listed in your Gemfile.
```

以下のコマンドで対処してください。

```
docker-compose run web bundle install
```
で対処すれば大丈夫です。

その後にまた

```
docker-compose build 
```

を打ってください。
これでコンテナをビルドできました。
そしたら、

```
docker-compose run web rails webpacker:install
````

でRailsの環境構築に必要なwebpackerをインストールしたら環境構築は完了です。
そうしたら一旦念の為にコンテナをビルドしたほうがいいと思います。
`docker-compose build`ですね。

そうしたらいよいよ起動です。
起動コマンドは

```
docker-compose up
```
です。
これでRailsの初期画面が出てきたら完了です。

#投稿機能作成の手順

まずはじめにcdコマンドを打って自分のアプリケーションに移動してください。

その後に

```
docker-compose run web rails generate scaffold post content:text
```

と打ってエンターを押してください

postから先は自由に決めてください。
これでデータベースの型ができました。

そしてその後に

```
docker-compose run web rails db:migrate
```

を実行して作成したマイグレーションファイルの設定などのDB周りの設定の部分をDBに反映してください。

これで完了しました。

#参考記事

https://qiita.com/azul915/items/5b7063cbc80192343fc0

この記事のコードをかなりパクって作成しました。
それではまた。