DevContainer+Railsで爆速ローカル環境構築

# はじめに
本稿では使用している技術の説明は行いません。
各自で調べてください。
# 対象者
Docker、linux、devcontainerの基礎知識がある方
急ぎでRailsをWebアプリケーションとしてサクッと構築したい方
最小設定内容を知りたい方
# ファイル作成
以下の構成となるようにファイルを作成してください。
```
project root
└── .devcontainer
    ├── infra
    │   ├── ruby
    │   │   └── Dockerfile
    │   └── mysql
    │       └── 1_ddl.sql
    ├── .env
    ├── docker-compose.yml
    ├── devcontainer.json
    └── Taskfile.yml
```
## ファイル作成
### container/ruby/Dockerfile
```Dockerfile
FROM ruby:3.4-bookworm

ENV TZ=Asia/Tokyo

ENV APP_ROOT /myapp
WORKDIR $APP_ROOT

# 必要なパッケージのインストール
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client yarn

# Task Runner のインストール
RUN curl -sL "https://github.com/go-task/task/releases/download/v3.9.0/task_linux_amd64.deb" -o task.deb && dpkg -i task.deb && rm task.deb

# ブランチ名がbashで表示されるようにカスタマイズ
COPY ../.bashrc /root/.bashrc

# keychainでgitのSSHキーを扱えるようにする。
RUN apt-get update && apt-get install -y keychain

# アプリ全体をコピー
COPY . .

# ポートを指定
EXPOSE 3000

# 以下3つはrailsをインストールしたらコメントアウトを解除してください。
# 必要ファイルをコピー
# COPY ../Gemfile ../Gemfile.lock ./
# Gemインストール
# RUN bundle install
# デフォルトコマンド
# CMD ["bash", "-c", "rm -f tmp/pids/server.pid && bundle exec rails server -b 0.0.0.0 -p ${APP_PORT}"]
```

### .env
```env
# 環境情報
# 語群はci dev stg prod
APP=dev

# アプリケーション設定
APP_NAME="Rails base"
APP_PORT=8086

# DB周り
MYSQL_USER=user
MYSQL_PASSWORD=password
DB_PORT=3308
MYSQL_DATABASE=development
```
### docker-compose.yml
```yml
version: "3"
services:
  app:
    build:
      context: ../
      dockerfile: .devcontainer/infra/ruby/Dockerfile
    env_file:
      - .env
    tty: true
    ports:
      - ${APP_PORT}:${APP_PORT}
    volumes:
      - ../:/myapp
      - ~/.gitconfig:/myapp/.gitconfig

  mysql:
    image: mysql:8.0
    ports:
      - ${DB_PORT}:3306
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ../.devcontainer/infra/mysql/:/docker-entrypoint-initdb.d/
      - db-data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}

volumes:
  db-data:
    driver: local
```
### devcontainer.json
```json
{
    "name": "Rails Base DevContainer",
    "dockerComposeFile": "docker-compose.yml",
    "service": "app",
    "workspaceFolder": "/myapp",
    "postCreateCommand": "task setup",
    "customizations": {
        "vscode": {
            "extensions": [
                "editorconfig.editorconfig", // エディタを跨いだ共通設定ファイルをVsCodeで実行するのに必要
                "ms-azuretools.vscode-docker", // VsCodeでのIntelliSenseやタブ補完用
                "saoudrizwan.claude-dev" // AIコーディングサポート
            ]
        }
    }
}
```
### 1_ddl.sql
```
CREATE SCHEMA IF NOT EXISTS `development` DEFAULT CHARACTER SET utf8mb4 ;
CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8mb4 ;

-- 'user'@'%' が未作成の場合、ユーザーを作成
CREATE USER IF NOT EXISTS 'user'@'%' IDENTIFIED BY 'password';
-- 'user'@'%' に対して `test` データベースの全権限を付与
GRANT ALL PRIVILEGES ON `test`.* TO 'user'@'%';
FLUSH PRIVILEGES;

-- セッションの文字セットをutf8mb4に設定
SET NAMES 'utf8mb4';
```
### Taskfile.yml
```yml
# https://taskfile.dev

version: '3'

env:
  MIGRATION_ROOT: "tools/migrations"
  SEED_ROOT: "tools/seeder"

tasks:
  setup:
    desc: "ローカル環境のセットアップを行う。(gitコマンドが使用できるようにする)"
    cmds:
      - cp {{.APP_ROOT}}/.gitconfig /root/.gitconfig
      - git config --global core.autocrlf input
      - git config --global --add safe.directory {{.APP_ROOT}}
      # わざわざコピーする理由は、commit時に毎回メアドとユーザー名の設定(.gitconfigの作成)を求められ面倒なので、git cloneするなら作成済みであろう.gitconfigを使うという魂胆である。
      # だが、Windowsユーザーが.gitconfigを使用中と解釈されるようでgit configコマンドが失敗するため、ファイルをコピーする必要がある。
      # core.autocrlf inputを使用する理由は、Linuxの改行コードが原因で差分が表示されてしまうため。
      # safe.directory $APP_ROOTを使用する理由は、WSL2側に配置しgitを使うには毎回求められるため。
```
# 環境構築手順
1.Dockerをインストール
2.VsCodeをインストール
3.ソースをクローン
4.VsCodeの拡張機能にDevContainersをインストール
5.Ctrl Shift Pでコマンドパレットを開く
6.DevContainer:Reopen in Containerを押下
7.Railsをインストール
``` bash
gem update --system
gem install rails -v "~> 8.0.0"
```
8.Railsプロジェクトを作成
```bash
rails new . --force --database=mysql
```
9.Dockerfileを修正する
以下の記載があるコマンドを解除
.devcontainer/infra/ruby/Dockerfile
```
# 以下3つはrailsをインストールしたらコメントアウトを解除してください。
```
# 完成ソースコード
https://github.com/shrimptails-f/rails_base