Ruby3, Rails7, MySQL, Tailwind, Dockerで作成する流れ

## 1. リポジトリを作成する

![スクリーンショット 2024-06-11 16.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731095/6ca9f8ed-9846-7f4f-a3d6-1aad38fc9185.png)

`rails new`すると`README.md`も作成されるので、この時はチェックしなくてもいいと思います。

## 2. 任意のディレクトリで Clone & CD

```zsh:zsh
git clone git@github.com:yoshiki1007/rails7-todo.git
Cloning into 'rails7-todo'...
warning: You appear to have cloned an empty repository.
```

空のリポジトリをクローンしたというメッセージが出ますが、実際に空ですので問題ありません。

```zsh:zsh
cd rails7-todo/
```

## 必要なファイルを作成する

### Dockerfile

```zsh:zsh
vi Dockerfile
```

Rails7からサーバーを起動するコマンドが変わったので、CMDには`["./bin/dev"]`を使用します。

```Dockerfile:Dockerfile
FROM ruby:3.2.4

ENV ROOT="/rails-todo"
ENV LANG=C.UTF-8
ENV TZ=Asia/Tokyo

RUN apt update -qq && apt install -y mariadb-client vim

RUN mkdir ${ROOT}
WORKDIR ${ROOT}
COPY Gemfile ${ROOT}/Gemfile
COPY Gemfile.lock ${ROOT}/Gemfile.lock
RUN bundle install
COPY . ${ROOT}

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh

ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["./bin/dev"]
```

### docker-compose.yml

```zsh:zsh
vi docker-compose.yml
```
今まで`docker-compose.yml`の最上部でバージョン指定していましたが、廃止になったようです。

https://docs.docker.com/compose/compose-file/04-version-and-name/

また、webのcommandは`Dockerfile`に寄せます。

```yml:docker-compose.yml
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: "Asia/Tokyo"
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    volumes:
      - .:/rails-todo
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
volumes:
  mysql-data:
    driver: local
```

### entrypoint.sh

```zsh:zsh
vi entrypoint.sh
```

ここで`server.pid`を削除するようにしています。

```shell:entrypoint.sh
#!/bin/bash
set -e

rm -f /rails-todo/tmp/pids/server.pid

exec "$@"
```

### Gemfile

```zsh:zsh
vi Gemfile
```
Railsの7.xバージョンの最新の安定版をインストールします。

```ruby:Gemfile
source 'https://rubygems.org'
gem 'rails', '~>7'
```

### Gemfile.lock

空の`Gemfile.lock`を作成します。

```zsh:zsh
touch Gemfile.lock
```

### 確認
全てのファイルが作成されていることを確認します。

```zsh:zsh
ls
Dockerfile		Gemfile			Gemfile.lock		docker-compose.yml	entrypoint.sh
```

この後`rails new`すると色々とファイルの追加、変更があるため
僕の場合はいつでも戻れるように一旦ここで`git commit`します。

## rails new する

```zsh:zsh
docker compose run web rails new . -j importmap -d mysql --css tailwind --skip-system-test
```

1. `-j importmap`: Importmapを使用する
2. `-d mysql`: MySQLを設定する
3. `--css tailwind`: Tailwind CSSをインストールする
4. `--skip-system-test`: 後にRSpecをインストールする

`rauls new`を実行すると途中で何度か、ファイルをオーバーライドするか聞かれます。

Dockerfileは`n`
その他は全てEnter（Y）します。

```zsh:zsh
 ✔ Container rails7-todo-db-1  Started                                                                                                                                                                     0.4s
       exist
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  .gitattributes
    conflict  Gemfile
Overwrite /rails-todo/Gemfile? (enter "h" for help) [Ynaqdhm]
```

### imageのbuild

```zsh:zsh
docker compose build
```

### コンテナ立ち上げ

```zsh:zsh
docker compose up
# or
docker compose up -d
```

### Contaienr name 確認

```zsh:zsh
docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS         PORTS                               NAMES
068e7015eaab   rails7-todo-web   "entrypoint.sh ./bin…"   About a minute ago   Up 8 seconds   0.0.0.0:3000->3000/tcp              rails7-todo-web-1
f0eb681ff83d   mysql:8.0         "docker-entrypoint.s…"   4 minutes ago        Up 8 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   rails7-todo-db-1
```

NAMESのrails7-todo-web-1を確認し、以降使用します。

### ログに接続

```zsh:zsh
docker attach rails7-todo-web-1
```

### コンテナに入る

```zsh:zsh
docker exec -it rails7-todo-web-1 /bin/bash
```

## DB構築

このままではDBに接続できないので、`database.yml`を修正します。

```yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
  host: <%= ENV.fetch("MYSQL_HOST", "db") %>

development:
  <<: *default
  database: rails_todo_development
```

### DB作成

```zsh:zsh
root@068e7015eaab:/rails-todo# rails db:create
Created database 'rails_todo_development'
Created database 'rails_todo_test'
```

### Procfile.devの修正

作成された`Procfile.dev`では画面を表示できなかったため、`-b 0.0.0.0`を追加します。

```dev:Procfile.dev
web: bin/rails server -b 0.0.0.0
css: bin/rails tailwindcss:watch
```

## 完成

![スクリーンショット 2024-06-11 18.27.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731095/e9b31c9f-f0f7-c8bf-7192-ec7522597190.png)