Rails7 + Postgresql を Docker で環境構築
これまで Rails を、途中から Docker 化したことはあったものの、最初から Docker ありきで環境構築したことはありませんでした。
今回 Rails + Postgresql の環境を Docker で構築したので、備忘録として残します。
環境
開発端末
Intel Mac
Big Sur 11.0.1
構築環境
Rails7 を試してみたかったので、ruby とかも諸々最新にしてみました。
- Ruby: 3.1.2
- Rails: 7.0.2
- Postgresql: 14.2
手順
1. ファイルの準備
以下のような構成でファイルを作成します。
app ├ containers │ └ app │ ├ Dockerfile │ └ entrypoint.sh ├ docker-compose.yml ├ Gemfile └ Gemfile.lock
Dockerfile
FROM ruby:3.1.2-alpine3.15 ENV TZ="Asia/Tokyo" \ LANG="C.UTF-8" \ APP_ROOT="/app" \ ENTRYKIT_VERSION="0.4.0" WORKDIR $APP_ROOT #ENTRY KITの導入 RUN wget https://github.com/progrium/entrykit/releases/download/v${ENTRYKIT_VERSION}/entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \ && tar -xvzf entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \ && rm entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \ && mv entrykit /bin/entrykit \ && chmod +x /bin/entrykit \ && entrykit --symlink RUN apk update \ && apk add --no-cache \ alpine-sdk \ bash \ build-base \ libpq-dev \ nodejs \ tzdata \ vim \ yarn COPY Gemfile $APP_ROOT COPY Gemfile.lock $APP_ROOT RUN bundle install -j4 COPY containers/app/entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000
- できる限り軽量化してみたく、alpine のイメージを使ってみました。
が、これが最小の構成かは自信がない…(通常のイメージよりは軽いはずだが) libpq-dev
は postgresql 開発用に必要。mysql だったらmysql-client
等、適宜切り替えます。
entrypoint.sh
#!/bin/bash rm -f tmp/pids/server.pid bundle install -j4 --quiet bin/rails s -p 3000 -b 0.0.0.0
- コンテナ起動時に実行させたいコマンド。
docker-compose.yml
version: '3' services: app: build: context: . dockerfile: ./containers/app/Dockerfile ports: - "3000:3000" volumes: - .:/app tty: true stdin_open: true depends_on: - db db: image: postgres:14.2-alpine ports: - "5432:5432" volumes: - db-data:/var/lib/postgresql/data environment: POSTGRES_USER: root POSTGRES_PASSWORD: password volumes: db-data:
Gemfile
source 'https://rubygems.org' gem 'rails', '~> 7.0.2'
Gemfile.lock
空ファイルでおk。
2. rails new の実行
docker-compose run app rails new . --force --database=postgresql --skip-bundle --skip-test
オプション | 意味 | 備考 |
---|---|---|
--force | Gemfile を上書きさせる | |
--skip-test | Test 関連ファイルの作成をスキップ | 後で Rspec を導入するため |
--skip-bundle | bundle install をスキップ | |
--database | 使用する DB の種別指定 |
3. database.yml の設定
default: &default adapter: postgresql encoding: utf8 # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: db development: <<: *default database: app_development test: <<: *default database: app_test production: <<: *default database: app_production username: app password: <%= ENV["APP_DATABASE_PASSWORD"] %>
host
には docker-compose.yml の DB のサービス名であるdb
を指定しておく。
4. rails db:create
の実行
イメージをリビルドして、DB を作成する。
docker-compose build docker-compose run app rails db:create
5. コンテナを立ち上げ、動作確認
コンテナを立ち上げ、
dc up -d
http://localhost:3000/ へアクセスし、画面表示されるかを確認。
(Rails7 から初期画面変わったのかな?)
おわりに
これで(おそらく)最小限の環境構築ができました。
これを軸に必要となった gem 等どんどん入れていきたいと思います。