Docker, Rails7.1.3.2で環境構築する

# 初めに
初学者です。
webアプリを個人で開発するために、dockerを使用してruby on railsでの開発環境構築を実施した際の記録を共有します。
公開日時点での最新安定版を使用しています。

この記事で成功する前に一度挑戦し、上手くいかなかった時の記録はこちら。
https://qiita.com/tkhero555/items/87df4562c8745ef0b6ef



## 構築したい技術構成
| カテゴリ | 技術 |
|---|---|
| フロントエンド | javascript/Hotwire/bootstrap　|
| バックエンド | ruby3.3.0/rails7.1.3.2 |
| データベース | PostgreSQL16.2 |
| 認証 | devise |
| 環境構築 | Docker / docker-compose |
| CI/CD | Github Actions |
| インフラ　| heroku |


## docker関連のファイル作成　~rails newまで
新しいディレクトリを作成し、docker関連のファイルを作成する。

Dockerfile
```
# 現在の最新の安定版
FROM ruby:3.3.0
# 必要なパッケージをインストール
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
# ディレクトリを作成する　これはコンテナの中の話
RUN mkdir /myapp
# 作業ディレクトリを指定する
WORKDIR /myapp
#　gemfileをコンテナに追加する
ADD Gemfile /myapp/Gemfile
# gemfile.lockをコンテナに追加する
ADD Gemfile.lock /myapp/Gemfile.lock
# gemfileに記述された依存関係をインストール
RUN bundle install
# そのほかのファイルをmyappに追加
ADD . /myapp
```
Gemfile
```
source 'https://rubygems.org'
gem 'rails'
```
```compose.yaml
version: '3'
services:
  db:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_HOST_AUTH_METHOD=trust
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

コンテナを起動してrails new
```
docker compose run web rails new . --force --database=postgresql
```

rails関連のファイルが自動生成され、Dockerfileの中身がrails7.1が自動生成するものに入れ替わっている。
この自動生成Dockerfileは本番環境を想定しており、今回は上手く使えないので、冒頭で作成したDockerfileの内容に戻す。
（本番環境用ファイルを使いたい場合は、Dockerfile.prodなどのファイル名で置いておくといいかもしれない）

Dockerfileの中身を戻したら、イメージをbuildする。
```
docker compose build
```

database.yamlの記述を書き換える。
```database.yaml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
```

データベースを作成する。
```
docker compose run web rake db:create
```
```
[+] Creating 1/0
 ✔ Container docker_setting1-db-1  Running                                                     0.0s 
Created database 'myapp_development'
Created database 'myapp_test'
```

コンテナを起動してlocalhostにrailsアプリが表示されていることを確認する
```
docker compose up
```


## gem installとgenerate controllerをしてみる
今回制作するアプリではLINEBOTを使用したいので、line-bot-api gemを導入して、controllerを作成する。
この動作までを無事に完了できるかで、環境構築が成功しているかを確認する。

Gemfileに追記
```
gem 'line-bot-api'
```
bundle install
```
docker compose run web bundle install
```
イメージを再度buildする。
```
docker compose build
```
コントローラーを生成する。
```
docker compose run web bundle exec rails g controller LineBot
```
```
[+] Creating 1/0
 ✔ Container docker_setting1-db-1  Running                                                     0.0s 
      create  app/controllers/line_bot_controller.rb
      invoke  erb
      create    app/views/line_bot
      invoke  test_unit
      create    test/controllers/line_bot_controller_test.rb
      invoke  helper
      create    app/helpers/line_bot_helper.rb
      invoke    test_unit
```

コントローラーも無事作成できたので、環境構築は成功！


## 参考記事・サイト
https://qiita.com/jibiking/items/fc7b0141af4b13a32ec3

https://zenn.dev/yoiyoicho/articles/90e1ea64772ea8