はじめに
今回はDockerを用いて既存のrailsアプリの環境構築を行っていきます。 基本的なDockerの知識などは詳細には説明しないためご了承ください。
手順
railsプロジェクトをGithub上からローカル上に設定
まず、ローカルに環境構築を行うためのディレクト(build context)を作成しgit clone リポジトリパス
でrailsプロジェクトをローカル環境に持ってきて、git init
で初期化を行います。また、mainブランチから別のブランチを作成し、そこで作業しましょう。
Dockerfileの作成
つぎにDockerfileの作成を行います。rubyのバージョンは既存のRailsプロジェクトのGemfileを参考に作成します。
FROM ruby:3.2.2 RUN apt-get update -qq && apt-get install -y \ build-essential \ libpq-dev \ nodejs \ postgresql-client \ yarn WORKDIR /myapp ADD Gemfile Gemfile.lock /myapp/ RUN bundle install
今回はGemfileとGemfile.lockファイルは元々存在していたので、新たに作成は行いません。
docker-compose.ymlファイルの作成
次にdocker-compose.ymlファイルの作成です。
version: '3' volumes: db-data: services: db: image: postgres:12 volumes: - 'db-data:/var/lib//postgresql/data' environment: - 'POSTGRES_USER=postgres' - 'POSTGRES_PASSWORD=postgres' web: build: . volumes: - '.:/myapp' ports: - "3000:3000" environment: - 'DATABASE_PASSWORD=postgres' tty: true stdin_open: true depends_on: - db links: - db
これらは簡単に言うと、コンテナを起動させる際に必要なコマンドを集約したものであるのと、web(Railsプロジェクト)とdb(データベース)を繋げる役割をするものだと考えてください。
database.ymlファイルの作成
database.ymlファイルには元々存在していたのもに以下のコードを追加し、編集しました。
host: db user: postgres password: <%= ENV.fetch("DATABASE_PASSWORD") %> port: 5432
dbでpostgresのserviceを定義しているためdbなどを指定し、データベースにアクセスできるようにします。
Railsサーバーを起動させる
以上のファイルなどを作成したあとは、いよいよサーバーを起動させる準備をします。
まず、build contextでdocker compose build
でdockerimageを作成します。特にエラーなどが発生しなければimageができたと思います。
確認ができたら、作成したimageを基にdocker compose up -d
でコンテナを起動させます。-d
はバックグラウンドで起動するオプションです。
コンテナが作成できたらdocker compose exec web bash
でwebコンテナに入ってbashを起動して、Railsサーバーを起動させるのに必要なコマンドをコンテナ内で実行します。
Railsサーバーを起動させるために、rails db:create
でDBの作成します。
DB作成後、rails db:migrate
でDBに反映させます。
反映後にrails s -b 0.0.0.0
でRailsサーバーを起動させます。
Railsサーバー起動後
コンテナ内で起動後にお使いのwebブラウザ上でhttp://localhost:3000 を入力して、Railsプロジェクトにアクセスできるか確認します。 アクセスできたら、一度コンテナを停止し、上記の内容をdocker-compose.ymlのwebサービスに追加します。
version: '3' volumes: db-data: services: db: image: postgres:12 volumes: - 'db-data:/var/lib//postgresql/data' environment: - 'POSTGRES_USER=postgres' - 'POSTGRES_PASSWORD=postgres' web: build: . # 追加部分 command: bash -c "rails db:migrate && \ rails s -b 0.0.0.0" volumes: - '.:/myapp' ports: - "3000:3000" environment: - 'DATABASE_PASSWORD=postgres' tty: true stdin_open: true depends_on: - db links: - db
その際にrails db:create
はコンテナ内で初回のみ実行したいので、docker-compose.ymlファイルには記述しません。
追加したら、最後はdocker compose upのコマンドを実行して、http://localhost:3000 にアクセスできたら終了です。
さいごに
説明が不足している部分も多いですが、dockeを用いて環境構築する一連の流れは説明できたと思います。