[2024年4月版]DockerでRails環境を作りチーム開発をしようとした話

## 注意！
初めまして、駆け出し大学生エンジニアです。
この記事が初めての投稿になります。各所で見ずらい点があるかと思いますが、温かい目でご覧ください。また、技術的に不足している点があればコメントで指摘していただくと幸いです。
# 0. 背景
現在、大学のサークル活動で**Rails**を使用したWebアプリを開発しています。割と本格的な開発をしたく**Docker**を使用したチーム開発に挑戦しました。チームはまだ2人ですが...w。
その際、環境構築にめちゃくちゃ手こずりました。ざっと３週間ほど...。そんな３週間の苦労をここに記録しようと思います。

# 1.事前準備
今回は、チーム開発を目的としているので異なるPCを2台以上準備していただけると記事の内容を活かせると思います。

# 2. DockerでRailsの環境構築
この記事でDockerの説明は割愛させていただきます。
DockerでRailsの環境を構築するのは下記のサイトを参考にしました。この記事で「**12. サーバーの起動を確認**」まで行ってください。
＊「**8. config/database.yml**」で`host:db`の下の行に`port: dbのポート番号`を記述すると良
い思います。私の場合は`port: 3306`でした。この記述をすることで正常に動きました。DockerデスクトップのContainerからポートは確認できます。

https://qiita.com/devzooiiooz/items/bd58b1c3178341fa363f

 ## 2-1. 筆者の環境
　**PC①**　←　まずこのPCで環境構築しました
　OS : macOS sonoma 14.4.1
　CPU : M3

　**PC②** ←　次にこのPCにPC①の環境を共有してチーム開発する準備をします。
　OS : Windows11
　CPU : 11th intel core i7
# 3. チーム開発の準備
ここまで、自分のローカル（PC①）にDockerでのRails環境が構築できたと思います。筆者は`railsapp`で記事と同じファイルにしました。
## 3-1.　Githubにアップロード
Githubにリポジトリを作成します。今回は`qiita_test`と言いうリポジトリにしました。![スクリーンショット 2024-04-13 2.01.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769141/29aa2331-8ca9-13ab-2582-c083f5d0e1ff.png)
Githubにあるコマンドを実行してアプロードしてください。
＊`git init`や`git add`でうまくいかず下記のようなエラー出た場合は、`rails7app`と`railsapp`に`.git`という隠しファイルがあるために起こってい可能性が高いです。筆者は`railsapp`の`git add`ファイルを削除しました。そうすることでコマンドが実行できます。
```
base) rails7app % git add -A
error: 'railsapp/' does not have a commit checked out
fatal: adding files failed
```
## 3-2. PC②に`git clone`する
次に、PC②に`git clone`してチームでの開発環境を整えていきます。
## 3-3. PC②にもう一度DockerでRailsの環境を構築
初めは、`git clone`したら下記のコマンドを実行するだけで**PC①**の環境を作れると思いましたができませんでした。
```:ターミナル
docker compose run --rm webapp rails db:create
docker compose up -d
```
実行後
```:エラー
docker compose run --rm webapp rails db:create

Could not find sprockets-rails-3.4.2, mysql2-0.5.6, puma-6.4.2, jsbundling-rails-1.3.0, turbo-rails-2.0.5, stimulus-rails-1.3.3, cssbundling-rails-1.4.0, jbuilder-2.11.5, bootsnap-1.18.3, debug-1.9.2, web-console-4.2.1, capybara-3.40.0, selenium-webdriver-4.19.0, sprockets-4.2.1, msgpack-1.7.2, bindex-0.8.1, addressable-2.8.6, regexp_parser-2.9.0, xpath-3.2.0, rexml-3.2.6, rubyzip-2.3.2, websocket-1.2.10, public_suffix-5.0.5 in locally installed gems
Run `bundle install` to install missing gems.
```
上記のように`Could not find`というエラーが出ます。
### 解決方法
まず、cloneした`railsapp`のフォルダーを削除して、あたらいい空の`railsapp`フォルダー作成します。[**「7. railsプロジェクトを作る」**](https://qiita.com/devzooiiooz/items/bd58b1c3178341fa363f#:~:text=%3A%0A%20%20mysqldata%3A-,7.%20rails%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B,-%E4%BB%A5%E5%89%8D%E3%81%AF%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88)のコマンド実行します。（*今回はいきなり削除していますが、おそらくブランチ切って作業する方がいいと思います。）
 ```docker:ターミナル
 docker compose run --rm --no-deps webapp rails new . --force --css bootstrap --javascript esbuild --database mysql
 ```
 　実行した後に、[8. config/database.yml](https://qiita.com/devzooiiooz/items/bd58b1c3178341fa363f#8-configdatabaseyml)と[9. Procfile.dev](https://qiita.com/devzooiiooz/items/bd58b1c3178341fa363f#9-procfiledev)を編集することを忘れないでください。
編集を終えたら、再度`docker compose run --rm webapp rails db:create`と`docker compose up -d`を実行します。
```:エラー
bin/rails aborted!
ActiveSupport::MessageEncryptor::InvalidMessage: invalid base64 (ActiveSupport::MessageEncryptor::InvalidMessage)
/railsapp/config/environment.rb:5:in `<main>'
Tasks: TOP => db:create => db:load_config => environment
(See full trace by running task with --trace)
```
実行して上記のようなエラーが出た場合`railsapp\config\master.key`と`railsapp\config\credentials.yml.enc`のファイルに問題あります。詳しくは下記の記事が参考になります。
 
https://qiita.com/yutas-8/items/7727ea52210c560acf44
 
https://qiita.com/suzy1031/items/64598d44b428ccd7abc5

2個目の記事は[チームメンバーにキーを教えてもらう](https://qiita.com/suzy1031/items/64598d44b428ccd7abc5#%E3%83%81%E3%83%BC%E3%83%A0%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AB%E3%82%AD%E3%83%BC%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%82%82%E3%82%89%E3%81%86)が参考になります。
簡単に言うと、**PC②**は**PC①**の環境を`clone`しています。という事はその環境に合わせてPC①の`railsapp\config\master.key`の`railsapp\config\credentials.yml.enc`の値を**PC②**に与えないと接続できないという事です。
間違っていたらコメントで指摘してください
# 4. サーバの起動を確認
　`docker compose up -d`を実行して[http://localhost:3000/](http://localhost:3000/)にアクセスできたら完了です。

# 最後に
記事を書くために、新しく環境を作り直すと最後のエラーが起きませんでした。なぜなのか原因がわかりません。もし詳しい方いましたらコメントで指摘や補足よろしくお願いします。
最後まで、記事見てくださりありがとうございました。