最近、Dockerを使ってrailsの環境構築にチャレンジしたので、まとめておきたいと思います。
はじめに新規作成したフォルダの下に4つのファイルを作ってください(ファイル名は全く一緒でお願いします!)
- Dockerfile
- docker-compose
- Gemfile
- Gemfile.lock
それぞれのファイルの記述を順を追って紹介します。
Dockerfile
FROM ruby:3.1.2
RUN apt-get update -qq && apt-get install -y vim
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem update --system
RUN bundle update --bundler
RUN bundle install
COPY . /myapp
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
docker-compose.yml
docker-compose.yml
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
volumes:
- postgresql-data:/var/lib/postgresql/data
web:
build:
context: ./rails
command: bash -c "tail -f log/development.log"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
tty: true
stdin_open: true
volumes:
postgresql-data:
ちなみの公式ドキュメントにあるコードに加えて、以下も記述している。
environment:
- POSTGRES_PASSWORD=password
ポスグレのpasswordを設定しないとこの後、docker-compose run web rake db:create
でデータベースを作成する際にエラーが起きます。
また、dbの方にもportを指定しています。こうすることによって、TablePlusを使えるようにします。
rails/Gemfile
rails/Gemfile
source 'https://rubygems.org'
gem "rails", "~> 7.0.4"
railsのバージョンを指定しない場合、最新版がダンロードされます。
rails/Gemfile.locl
こちらは空のままにしておきます
rails/Gemfile.lock
rails/entrypoint.sh
rails/entrypoint.sh
#!/bin/bash
set -e
rm -f /myapp/tmp/pids/server.pid
exec "$@"
準備完了!コマンドを実行
docker compose run --rm rails rails new . --force --api --database=postgresql --skip-action-cable --skip-sprockets --skip-turbolinks --skip-webpack-install --skip-test --skip-bundle
データベースをPostgreSQLに指定して、アプリケーションを作成します。
また、webpackなど不要なものをスキップしておきます
docker compose run --rm rails bundle install
これでbundle installできます。
database.ymlを編集
database.ymlにhost,username,passwordを追加します
default: &default
adapter: postgresql
encoding: unicode
host: backend
username: postgres
password: password
pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
DBを作成
docker compose run web rails db:create
これで環境構築完了です。