はじめに
Docker Composeを使ってRailsアプリをコンテナ化する方法を解説します。
How to
コンテナ化したいプロジェクトを用意する
コンテナ化したいプロジェクトをGitHubからローカルにクローンします。
$ git clone <リポジトリのパス>
Dockerfileを用意する
Rails用のDockerfileを作成します。
FROM ruby:3.2.2 RUN apt-get update && apt-get install -y \ build-essential \ libpq-dev \ nodejs \ postgresql-client \ yarn WORKDIR /rails-docker COPY Gemfile Gemfile.lock /rails-docker RUN bundle install
FROM: ベースとなるrubyのイメージを取ってきます。
FROM ruby:3.2.2
RUN: 必要なパッケージをインストールします。
RUN apt-get update && apt-get install -y \ packages \
WORKDIR: 指定したフォルダに移動します。なければ、フォルダを作成し、そこに移動します。
WORKDIR /rails-docker
COPY: ファイルをコンテナにコピーします。
COPY Gemfile Gemfile.lock /rails-docker
RUN: コピーしたGemfileを元にrailsに必要なパッケージ(gem)をインストールする。
RUN bundle install
docker-compose.ymlを用意する
次にdocker-compose.ymlを作成します。
# docker-composeのversionを指定 version: '3' # db-dataというvolumeを作成 volumes: db-data: # ここから下にserviceを定義 services: # webというserviceを定義 web: # docker buildと同じ。カレントディレクトリを指定 build: . # サービスコンテナが起動したときに実行するコマンドを指定 # ">" -> 折り返して表示。 "-c" -> 複数コマンドを実行 command: > bash -c "rails db:create && rails db:migrate && rails s -b 0.0.0.0" # docker run -pと同じ。portを指定 ports: - '3000:3000' # docker run -vと同じ。マウント先を指定 volumes: - '.:/rails-docker' # コンテナ側に環境変数を設定 environment: - 'DATABASE_PASSWORD=postgres' # docker run -itと同じ tty: true stdin_open: true # db serviseを作成後、docker runする depends_on: - db # web serviceからdb serviceにアクセスできる links: - db # dbというserviceを定義 db: # imageを取得する image: postgres:12 # マウント先を指定 volumes: - 'db-data:/var/lib/postgresql/data' # パスワードを設定 environment: - 'POSTGRES_PASSWORD=postgres'
databese.ymlを編集する
railsのconfig/database.ymlを編集します。
default: &default adapter: postgresql encoding: unicode host: db user: postgres port: 5432 password: <%= ENV.fetch("DATABASE_PASSWORD") %> pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
コンテナを起動する
コンテナを起動させます。
-d(detach)でコンテナがバックグラウンドで起動します。
docker-compose up -d