【Rails】既存のRailsアプリをDocker化してみた【Docker + Ruby3.2.2 + Rails7.0.8 + importmap + Node.js 20.2.0 + Tailwind CSS + daisyUI + PostgreSQL】

# はじめに
お疲れさまです！
おおくまです！

今回は、既存の``Railsアプリ``を初めて``Docker化``してみました！
環境としては、
**Docker + Ruby3.2.2 + Rails7.0.8 + importmap + Node.js 20.2.0 + Tailwind CSS + daisyUI + PostgreSQL**
です！

データベースに関しては、ローカルでは``SQLite``、本番では``PostgreSQL``を使っていたので、どちらも``PostgreSQL``を使うように修正します！

また、サーバーを立ち上げる際は、``./bin/dev``のコマンドを使い、
**JSやCSSがビルドされ、なおかつJSやCSSを変更したときに自動的に再ビルドされる**ようにします！
備忘録として残したいと思います！

こちらが``Docker化``する前のリポジトリです！

https://github.com/kumaryoya/kuma_lab_before_docker

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# 環境
:::note
Ruby 3.2.2
Rails 7.0.8
Node.js 20.2.0
Docker Desktopをインストール済み
:::

# 手順
```diff_ruby:ターミナル
touch Dockerfile compose.yaml entrypoint.sh
```

``Docker化``したいアプリのディレクトリに移動した状態で、上記のコマンドを実行し、ファイルを3つ作成します！

それぞれコードを書いていきます！

```diff_ruby:Dockerfile
FROM ruby:3.2.2

ENV TZ Asia/Tokyo

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs && apt-get install -y vim

RUN curl -sL https://deb.nodesource.com/setup_20.x | bash - \
  && wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get install -y nodejs yarn

WORKDIR /kuma_lab

COPY Gemfile Gemfile.lock /kuma_lab/

RUN bundle install

COPY package.json yarn.lock /kuma_lab/

RUN yarn install

RUN yarn add daisyui

COPY . /kuma_lab/

COPY entrypoint.sh /usr/bin/

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

ENTRYPOINT ["entrypoint.sh"]

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

```diff_ruby:compose.yaml
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_volume:/var/lib/postgresql/data
    ports:
      - '5432:5432'
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: sh -c "rm -f tmp/pids/server.pid && ./bin/dev"
    volumes:
      - .:/kuma_lab
      - node_modules:/kuma_lab/node_modules
    ports:
      - 3000:3000
    stdin_open: true
    tty: true
    depends_on:
      - db
volumes:
  postgres_volume:
  node_modules:
```

```diff_ruby:
#!/bin/bash

set -e

rm -f /kuma_lab/tmp/pids/server.pid

exec "$@"
```

次に``Procfile.dev``を編集します！

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

次に``データベース``周りを編集していきます！

```diff_ruby:ターミナル
: > Gemfile.lock
```

```diff_ruby:Gemfile
# 〜中略〜
+ gem 'pg'

group :development, :test do
  gem 'debug', platforms: %i[mri mingw x64_mingw]
- gem 'sqlite3', '~> 1.4'
end

- group :production do
-   gem 'pg'
- end
```

```diff_ruby:ターミナル
docker compose exec web bundle install
```

```diff_ruby:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: user
  password: password
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: test_app_development

test:
  <<: *default
  database: test_app_test

production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
```

```diff_ruby:ターミナル
docker-compose up -d --build
docker compose exec web rails db:prepare
```

上記のコマンドで、ビルドし、データベースをセットアップすれば、環境構築は終了です！

こちらが``Docker化``した後のリポジトリです！

https://github.com/kumaryoya/kuma_lab

お疲れ様でした！