1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerを使用してRailsアプリをRenderへデプロイした

Last updated at Posted at 2024-09-26

この記事は、Dockerを使用してReilsアプリをRenderへデプロイしたいが、エラーが出てデプロイできていない方向けの記事です。

環境

Rails 7.2.1
Ruby 3.2.0
PostgreSQL
Dockerを使用

フォルダ・ファイル構成

image.png
※Dockerfileはrailsapp内にもう一つあります。

結論下記の内容でデプロイに成功した。

render.yaml
services:
  - type: web
    name: compassbook
    env: ruby
    rootDirectory: railsapp
    buildCommand: |
      echo "Starting build process..."
      bundle install
      yarn install
      rails assets:precompile
      echo "Build completed."


下記、railsapp/Dockerfile

# syntax = docker/dockerfile:1

# ベースイメージの指定
ARG RUBY_VERSION=3.2.0
FROM ruby:$RUBY_VERSION-slim AS base

# 作業ディレクトリの設定
WORKDIR /rails

# 必要なパッケージのインストール
RUN set -eux; \
    apt-get update -qq; \
    until apt-get install --no-install-recommends -y \
        curl \
        libpq-dev \
        libjemalloc2 \
        libvips \
        git; do \
      echo "apt-get install failed, retrying in 5 seconds..."; \
      sleep 5; \
      apt-get update -qq; \
    done; \
    rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*

# 環境変数の設定
ENV RAILS_ENV=production \
    BUNDLE_DEPLOYMENT=1 \
    BUNDLE_PATH=/usr/local/bundle \
    BUNDLE_WITHOUT=development

# ビルドステージの開始
FROM base AS build

# ビルドに必要なパッケージのインストール
RUN set -eux; \
    apt-get update -qq; \
    until apt-get install --no-install-recommends -y \
        build-essential \
        libpq-dev \
        git \
        node-gyp \
        pkg-config \
        python-is-python3; do \
      echo "apt-get install failed, retrying in 5 seconds..."; \
      sleep 5; \
      apt-get update -qq; \
    done; \
    rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*

# Node.js と Yarn のインストール
ARG NODE_VERSION=20.17.0
ARG YARN_VERSION=1.22.22
ENV PATH=/usr/local/node/bin:$PATH
RUN curl -sL https://github.com/nodenv/node-build/archive/master.tar.gz | tar xz -C /tmp/ && \
    /tmp/node-build-master/bin/node-build "$NODE_VERSION" /usr/local/node && \
    npm install -g yarn@$YARN_VERSION && \
    rm -rf /tmp/node-build-master

# アプリケーションの Gem をインストール
COPY Gemfile Gemfile.lock /rails/
RUN bundle install && \
    rm -rf ~/.bundle/ "$BUNDLE_PATH"/ruby/*/cache "$BUNDLE_PATH"/ruby/*/bundler/gems/*/.git

# Node.js の依存関係をインストール
COPY package.json yarn.lock /rails/
RUN yarn install --frozen-lockfile

# アプリケーションコードをコピー
COPY . /rails

# Bootsnap のプリコンパイルと権限設定
RUN bundle exec bootsnap precompile app/ lib/
RUN chmod +x ./bin/rails

# アセットのプリコンパイル
ARG DATABASE_URL
ARG SECRET_KEY_BASE
ENV DATABASE_URL=$DATABASE_URL
ENV SECRET_KEY_BASE=$SECRET_KEY_BASE
RUN DATABASE_URL=$DATABASE_URL RAILS_ENV=production SECRET_KEY_BASE=$SECRET_KEY_BASE bundle exec rails assets:precompile

# 不要な Node.js モジュールを削除(任意)
RUN rm -rf node_modules

# 最終ステージの開始
FROM base

# ビルド済みのアーティファクトをコピー
COPY --from=build "$BUNDLE_PATH" "$BUNDLE_PATH"
COPY --from=build /rails /rails

# ファイルの所有権とパーミッションを設定
RUN groupadd --system --gid 1000 rails && \
    useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \
    chown -R rails:rails /rails

USER rails

# 作業ディレクトリの設定
WORKDIR /rails

# 環境変数の設定
ENV RAILS_ENV=production

# ポートの公開
EXPOSE 3000

# CMD の設定
CMD ["bash", "-c", "bundle exec rails db:migrate && bundle exec rails server -b 0.0.0.0 -p 3000"]

デプロイポイント

その1 無料で使うならPostgreSQL

はじめ、MySQLでRailsアプリを使っていたが、Renderで用意されているDBはPostgreSQLでした。MySQLはなし。
MySQLからPostgreSQLに変更しても問題ないことを確認し、PostgreSQLに変更しました。
Railsアプリをポートフォリオとして作成し無料で使えるデプロイ先を探す場合、Herokuが有料化されたことにより、無料デプロイ先はRenderになるかと思われる。そんなかたは、最初からPostgreSQLを使ってRailsアプリを作成することをお勧めする。

その2 Exited with status 128というエラー

下記、デプロイ終わりごろのExited with status 128というエラー

Pushing image to registry...
Upload succeeded
DONE
==> Deploying...
==> Exited with status 128
==> Common ways to troubleshoot your deploy: https://docs.render.com/troubleshooting-deploys

「Exited with status 128」の一行しか表示されず、詳細なログが確認できないため何の原因でこのエラーが出ているのか分かりにくい。

結論として、Gemfileやアプリケーションコードのコピー先パスが間違っていたことが原因のようだ。
Dockerを使用していることにより、Renderで下記の設定をしている。
image.png
railsappフォルダをルートディレクトリとしている。

railsapp内のDockerfileで下記、(Renderでの作業フォルダ)railsフォルダを作業フォルダにしている。

# 作業ディレクトリの設定
WORKDIR /rails

railsappフォルダとrailsフォルダがあり、さらにルートディレクトリをrailsappとしていたことで、コピー元先のファイルパスに誤りが出てしまった。

まとめ

デプロイで困っている方にこの記事が参考になれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?