RailsプロジェクトをDocker化する手順（Rails, postgresql）

## はじめに
既存のRailsプロジェクトをdocker化する機会があったため、手順を記載していく。

## docker化の概要
- 既存のRailsプロジェクト
    - Ruby 3.0.2
    - Rails 6.0.3
    - postgresql 12
- 環境
    - Windows 11 Home (wsl2/Ubuntu)


## 手順
### 事前準備
- 既存のRailsプロジェクトをclone
- Dockerfile, docker-compose.ymlをプロジェクト内に新規作成

### Dockerfile作成
イメージのビルド手順を記載する。


```dockerfile:Dockerfile
FROM node:14.17.6 as node
# ベースイメージ
FROM ruby:3.0.2

# Install Node.js and Yarn
COPY --from=node /opt/yarn-* /opt/yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
  && ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx \
  && ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
  && ln -fs /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg

RUN apt-get update -qq && \
  apt-get install -y build-essential \
  libpq-dev \
  postgresql-client \
  # Clean up cached package data
  && apt-get clean \
  # Remove the cache file of the package list
  && rm -rf /var/lib/apt/lists/*

RUN mkdir /rails-docker
WORKDIR /rails-docker

COPY Gemfile /rails-docker/Gemfile
COPY Gemfile.lock /rails-docker/Gemfile.lock

RUN bundle install

COPY package.json yarn.lock ./
RUN yarn install

COPY . /rails-docker

```



重要なポイントを一つずつ詳しく見ていきます。
#### マルチステージビルド
マルチステージビルドを使用すると、複数の```FROM```命令で、異なるベースイメージを使用することが可能です。
今回はメインで使用するRubyのイメージと併せて、nodeのイメージを使用しています。
マルチステージビルドを使用することで、イメージサイズを必要最小限にできることがメリットです！

```dockerfile:Dockerfile
FROM node:14.17.6 as node
# ベースイメージ
FROM ruby:3.0.2

# Install Node.js and Yarn
COPY --from=node /opt/yarn-* /opt/yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
  && ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx \
  && ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
  && ln -fs /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg
```

```ruby:3.0.2```をベースイメージとして、```COPY --from=node```を使用して、```node:14.17.6```のベースイメージからnode/yarnをインストールしています。

#### パッケージのインストール
必要なパッケージをインストールします。
- build-essential: ビルドに必要な基本的な開発パッケージ
- libpq-dev: PostgreSQLデータベースにアクセスするための開発ファイル
- postgresql-client: PostgreSQLデータベースに接続するためのクライアントツール

```dockerfile:Dockerfile
RUN apt-get update -qq && \
  apt-get install -y build-essential \
  libpq-dev \
  postgresql-client \
  # Clean up cached package data
  && apt-get clean \
  # Remove the cache file of the package list
  && rm -rf /var/lib/apt/lists/*
```

### docker-compose.yml作成
コンテナ間の関連や設定を記載します。



```yml:docker-compose.yml
version: '3'
services:
  # DBコンテナ
  db:
    # PostgreSQLを設定
    image: postgres:12
    # 環境変数を設定
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
    volumes:
      - db-data:/var/lib/postgresql/data

  # WEBコンテナ
  web:
    build: .
    command: bash -c "rails db:create && rails db:migrate && bundle exec rails s -p 3000 -b '0.0.0.0'"
    # 
    volumes:
      - .:/rails-docker
    environment:
      - 'DATABASE_PASSWORD=postgres'
    ports:
      - "3000:3000"
    # DBコンテナの起動後に起動するように設定
    depends_on:
      - db

volumes:
  db-data:

```

### プロジェクトのビルド
- Railsアプリのひな型を作成する（DBはPostgreSQLを指定）
``docker-compose run web rails new . --force --database=postgresql``

- 再度ビルドする
新しいGemfileが作成されたので、




### DB接続設定



## マルチステージビルドとは？

## 注意点