0
0

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環境を整える

0
Posted at

はじめに

今回はDockerでの開発環境を整えるため、

  • rails newの実行
  • Rails APIとして使うためのDockerfileの作成

を行いました。
今回私は、最初にDockerfileの作成→rails new実行という順序で行ってしまったのですが、Githubのリモートをローカルに追加する際、Dockerfileが上書きされてしまったので、rails new実行→好みのDockerfileのに編集、という流れが1番自然だと気づきました。
今回は、その自然な順序でまとめていきたいと思います。

Dockerイメージの作成

早速rails newを実行したいところだが、その前にDockerを作成する。
rails newはどこで実行するかによって結果が全く変わるので、用途によって正しい順番がある。
今回はdocker環境での実装なので、docker内でrails newを実施するのが正しい。

詳しい理由

  • 理由1: Railsが生成する環境がLinux向けになる
    Docker は「Linux の機能(namespaces / cgroups)」を使ってコンテナを作っている。
  • 理由2:bundle install も Docker 内(Linux)で行われる
    ローカルでrails newをすると、ローカルでもDocker内でもbundle installをしなければいけなくなる。
  • 理由3:Dockerfile の文脈で rails new ができる
    ローカルで生成してしまうとDockerと整合しないファイルが生成されてしまう。
  • 理由4:本番環境(AWS ECS / Render / Railway)と同じ OS で動作する
    ローカルと本番環境での差異が消える。

なのでまずはDockerをたちあげる。

docker-compose build

rails newを実施

1. rails newとは

rails newとは、Railsアプリの雛形を作成してくれるもの。ローカルマシンにRubyやRailsの環境がなくても、簡単に新しいRailsプロジェクトの雛形を作成できる。
rails new実行時にオプションをつけると色々な指定をした状態でアプリのひな形を生成することがでる。
*オプション一覧はこちら↓

今回のオプション

  • -api
    API専用モードで Rails を作るオプション
    通常の Rails は、
    ・views(HTMLテンプレート)
    ・assets(CSS/JS)
    ・helpers
    ・middleware
    などが全部揃った “フルスタック” Railsだが、今回は React をフロントに使うので、Rails は API として動くだけで十分。
    -api をつけると:
    ・余計な HTML 構造が一切不要になる
    ・コントローラが API 向けに軽量化される
    ・ミドルウェアが減って高速化
    ・APIとしての開発が超シンプル
  • d postgresql
    データベースを PostgreSQL にする
    rails new のデフォルトは sqlite3 となるが、今回はPostgreSQLに設定。
    d postgresqlをすることで、PostgreSQL 用の database.yml が生成される。
  • -force
    既存ファイルを “上書き” するオプション

2. rails newを実施

これらのオプション付きrails newをdocker内で実行。

docker-compose run --rm api rails new . --api -d postgresql --force

Dockerfileの編集

今回は本番用ではなく、開発用にシンプルなDockerfileを作成。

FROM ruby:3.2

RUN apt-get update -qq && apt-get install -y \
  build-essential \
  libpq-dev \
  curl

RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
RUN apt-get install -y nodejs

RUN corepack enable

WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install

COPY . /app

全てを理解できるわけではないが、できる限りフォローアップ。

1. FROM ruby:3.2

Docker で使う OS + 言語環境の元イメージ。
これは Debian Linux + Ruby が入った公式イメージ。

2. Debian Linux のパッケージをインストール

RUN apt-get update -qq && apt-get install -y \
  build-essential \
  libpq-dev \
  curl

この3つはRails開発に必須

  • build-essential
    C言語のコンパイラ。
    Rails の gem の多くは内部で C をコンパイルするので必要。
  • libpq-dev
    PostgreSQL と接続するためのライブラリ。
    AWS RDS(PostgreSQL)と Rails を接続するのに必須。
  • curl
    Node.js のセットアップで使う。

3. Node.js のセットアップ

RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
RUN apt-get install -y nodejs

Rails 7 は JS をほぼ使わない API モードでも、内部で Node.js が必要になる場面がある。
今回はReactと接続する予定なので、Nodeが必須。

4. corepack enable

RUN corepack enable

corepack は npm / yarn の管理ツール。これにより Yarn が使えるようになる。

5. Rails を置くディレクトリ設定

WORKDIR /app

Docker の中で Rails のプロジェクトを /app に置く標準的な設定。

6. Gemfile と Gemfile.lock をコピー

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

Gemfile が変わらない限り、bundle install を再実行しなくて済む。

7. bundle install(Rails の gem 全部インストール)

RUN bundle install

Rails や依存ライブラリが Docker 内に入る。

8. プロジェクト全体をコピー

COPY . /app

ここで初めて Rails のコード全体を Docker に入れる。

イメージの再ビルド、立ち上げ

Dockerfile を変更したら必ず再ビルドが必要。

docker-compose build --no-cache

Dockerfile は「イメージを作る設計図」。中身を変えたら 設計図に合わせてイメージを作り直す必要がある。
--no-cacheをつけたのは、Rails new が Dockerfile を上書きしていたせいで
古いキャッシュが残っていると不具合が出る可能性があったため。

再ビルトができたら、立ち上げる。

docker-compose up

すると、Rails が起動して localhost:3000 にアクセスできる。
アクセスするとDB設定がまだローカル向けでエラーが出ているが、今回はここまで。

終わりに

今回学んだこと

  • rails newを実施するタイミング
  • Dockerfileの中身の意味
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?