Cloud9,Rails6,Mysql,Dockerで環境構築（2023/04）

## はじめに
* Cloud9環境下でRails６×Dockerの環境構築を試みるもまとまった生地がなく苦労したため執筆（自分用）。
* 複数の情報源からかき集めた手順、エラー対処等の組み合わせのため、不要な記述等がある可能性が高いです
* プログラミング学習２か月目の初心者です。誤りなどありましたらお教えいただけると幸いです。

## 参考
* https://qiita.com/hello_sk/items/803d0f0c97b7c4d19403
* https://www.youtube.com/watch?v=Fq1PH0Gwi8I&ab_channel=FarStep%E3%80%90%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%AC%9B%E5%BA%A7%E3%80%91
(→Rails5の場合の構築手順をまとめられています。主にこちらを参照）
* https://zenn.dev/yuma_ito_bd/scraps/1adb89dfe0661c
(→Rails6の場合に追記する必要のある部分などはこちらから参照）
* https://c-a-p-engineer.github.io/tech/2021/07/05/docker-mysql/
* https://qiita.com/higaki-takanori/items/b46eecdf0de740716418
* https://kim-shun.hatenablog.com/entry/2021/07/19/080548
（→詳細は省きますがこれらの記事に紹介されているエラーが出たので、対処のため一部記述を頂いています）

## 環境
* Ruby 3.1.2

## 手順
**※Docker,Docker-composeがインストールされている状態で始めます**

**1\. 必要ファイルの作成** 
 新規にディレクトリを作成して、cdで移動。ターミナルに
```
$ touch Dockerfile
$ touch docker-compose.yml
$ touch Gemfile
$ touch Gemfile.lock
```
でファイルを作成する。
<br>


**2\. Dockerfileの記述**
※webpackerを利用するためにyarn,npmが必要。以下のように記述するとインストールされる。あとから`$ docker-compose run web yarn install`を実行してもエラーを吐くのでこの段階で記述する必要あり。
Nodeのバージョンが高すぎることでエラーになる場合もあるため、動作確認できているバージョンを指定します。
```Docker:Dockerfile
FROM ruby:3.1.2
RUN apt-get update -qq && apt-get install -y postgresql-client

RUN mkdir /myapp
WORKDIR /myapp

RUN apt-get install -y nodejs npm && npm install n -g && n 16.19.1
RUN npm install --global yarn

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install
COPY . /myapp
```
<br>
<br>


**3\. docker-compose.ymlの記述**
```yml:docker-compose.yml
version: '3'

services:
    db:
        image: mysql:5.7
        environment:
            MYSQL_ROOT_PASSWORD: password
            POSTGRES_HOST_AUTH_METHOD: 'trust'
        ports:
            - "3306:3306"
        volumes:
            - ./db/mysql/volumes:/var/lib/mysql

    web:
        build: .
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 8080 -b '0.0.0.0'"
        volumes:
            - .:/myapp
            - gem_data:/usr/local/bundle
        ports:
            - 8080:8080
        depends_on:
            - db 
        tty: true
        stdin_open: true

volumes:
  gem_data:

```
Cloud9用のポート指定と、MySQLのパスワード周りで発生するエラーに対応する記述をしてあります。
<br>
**4\. Gemfileの記述**
```ruby: Gemfile
source 'https://rubygems.org'
gem 'rails', '6.1.7.3' #適したバージョンを指定
```

**5\. Gemfile.lockの記述**
こちらは何もかかなくてOK。
<br>

**6\.アプリケーション作成**
```
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
```
これで初めに作ったディレクトリ配下にRailsアプリケーションのひな型が作成されます。

**7\.編集権限設定**
```
$ sudo chown -R $USER /home/ec2-user/environment/myapp
#対象のフォルダは自分の環境に合わせてください
```
編集権限がなくファイルに記述を加えられないことがあるので、上記のコマンドで事前に解消します。
<br>
**8\./config/database.ymlに記述**
```yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

```
MySQLの設定をしています。先ほどdocker-compose.ymlで記述した値に合わせます。
権限系の警告が出てしまう場合は以下の記事を参考に権限設定を変更してみます。
https://qiita.com/hello_sk/items/803d0f0c97b7c4d19403
<br>
**9\.config/environments/development.rbに記述**
```ruby:deveropment.rb
Rails.application.configure do
 #省略
 config.hosts.clear
end
```
一番下の行に追記します。
<br>

**10\.起動前の設定、→ビルド**
```
$ docker-compose run web bundle install
$ docker-compose run web rails webpacker:install
$ docker-compose build
```
ブラウザにNoDatabaseErrorが表示されたらOK。
<br>

**11\.データベースの作成**
新たにターミナルを立ち上げて、以下を実行。
```
$ docker-compose run web rails db:create
```
<br>

**12\. 起動**
```
$ docker-compose up
```
Railsのトップページが表示されていれば成功です。