rails7 + Mysql8.0 + Docker Composeで開発環境構築

# はじめに
- rails7 + Mysql + Docker Composeの開発環境を構築していきます。

# 前提
- WSL2・Docker・VScodeがインストールされていること

# 構築手順
- 作業ディレクトリの作成
```bash
mkdir rails7-docker
cd rails7-docker
```

- 空ファイルの準備
```bash
touch {Dockerfile.dev,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh}
```

- Dockerfile.devの編集
```Dockerfile
FROM ruby:3.2.2
ARG RUBYGEMS_VERSION=3.3.20

# 作業ディレクトリを指定
WORKDIR /sample_rails

# ホストのGemfileをコンテナ内の作業ディレクトリにコピー
COPY Gemfile Gemfile.lock /sample_rails/

# bundle installを実行
RUN bundle install

# ホストのファイルをコンテナ内の作業ディレクトリにコピー
COPY . /sample_rails/

# entrypoint.shをコンテナ内の作業ディレクトリにコピー
COPY entrypoint.sh /usr/bin/

# entrypoint.shの実行権限を付与
RUN chmod +x /usr/bin/entrypoint.sh

# コンテナ起動時にentrypoint.shを実行するように設定
ENTRYPOINT ["entrypoint.sh"]

# コンテナ起動時に実行するコマンドを指定
CMD ["rails", "server", "-b", "0.0.0.0"]
```

- docker-compose.ymlの編集
```yml
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydatabase
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - mysql_volume:/var/lib/mysql
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password

  web:
    build:
      context: .
      dockerfile: Dockerfile.dev
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails tailwindcss:build && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/sample_rails
    ports:
      - 3000:3000
    stdin_open: true
    tty: true
    depends_on:
      - db
volumes:
  mysql_volume:
```

- Gemfileの編集
```
source 'https://rubygems.org'
gem 'rails', '~> 7.0'
```

- entrypoint.sh の編集
```bash
#!/bin/bash
set -e

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

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

- Railsプロジェクトの作成
```bash
docker-compose run web rails new . --force --no-deps --database=mysql --css=tailwind --skip-jbuilder --skip-action-mailbox --skip-action-mailer --skip-test
```

- Dockerfileの名前変更
Dockerfile⇒Dockerfile.prod
※rails new実行後、Dockerfileが自動生成される

- Dockerコンテナイメージの作成
```
docker-compose build
```

- config/database.ymlの編集
```yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default
  database: sample_rails_development

test:
  <<: *default
  database: sample_rails_test
```
- database.ymlの権限変更し、保存
```bash
cd config
sudo chown ユーザ名 database.yml
```


- データベースの作成
```bash
docker-compose run web rails db:create
```

- コンテナの起動
```bash
docker-compose up -d
```

- http://localhost:3000/ へアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3382528/45844375-a79f-41a8-867b-a47f3a9a758d.png)


- 簡単なCRUDアプリケーションを作成
```bash
docker-compose run web rails g scaffold post title:string body:text
```

- データベースのマイグレーション
```bash
docker-compose run web rails db:migrate
```

- Railsサーバの再起動
```bash
docker-compose restart
```

- CRUDアプリケーションの動作確認
 http://localhost:3000/posts/new へアクセス

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3382528/7275413a-9074-4c1c-b9c6-8a9a4bb4dac3.png)


 - コンテナ削除
 ```bash
 docker-compose down
 ```

# おわりに
- 無事開発環境の構築ができました。ざっくり手順を備忘録として残しています。

 # 参考記事
 - https://musclecoding.com/rails7-mysql8-docker/#index_id19
 - https://qiita.com/shinry/items/50fdc0b39dcd2bf84356