はじめに
既存の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
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
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
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作成
コンテナ間の関連や設定を記載します。
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が作成されたので、