Railsの開発環境をDocker化
Docker、docker-composeで既存のRailsアプリをDocker化する方法についてまとめてみます。
バージョン
- ruby 3.0.2
- rails 6
- node 14.19.1
- postgres 15
1. Dockerfileの作成
今回はnodejsやyarnのインストールにapt-get
ではなくマルチステージビルドを利用します。
少しですがビルドの時間を短くし、イメージサイズも小さくするためです。
Dockerfile
FROM node:14.19.1 as node
FROM ruby:3.0.2
ENV YARN_VERSION 1.22.17
COPY --from=node /opt/yarn-v${YARN_VERSION} /opt/yarn/
COPY --from=node /usr/local/bin/node /usr/local/bin
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules/
RUN ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \
&& ln -s /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs \
&& ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
&& ln -s /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx
RUN apt-get update -qq && apt-get install -y \
build-essential \
libpq-dev
WORKDIR /myapp
COPY Gemfile Gemfile.lock /myapp/
RUN bundle install
COPY . /myapp/
2. docker-compose.ymlの作成
docker composeとは複数のコンテナを一括で効率的に操作できるツールのことです。
docker-compose.ymlにはコンテナの利用方法、起動方法を定義しておきます。
ここに書いておくことでコンテナの起動時に毎回毎回オプションの指定などしなくて済むようになります。
docker-compose.yml
version: '3'
services:
db:
image: postgres
volumes:
- 'db-data:/var/lib/postgresql/data'
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_USER=postgres
- POSTGRES_DB=mydb
web:
build: .
command: bash -c "rm -f /myapp/tmp/pids/server.pid && bundle exec rails s -b '0.0.0.0'"
ports:
- '3000:3000'
volumes:
- .:/myapp
environment:
- POSTGRES_PASSWORD=postgres
tty: true
stdin_open: true
depends_on:
- db
volumes:
db-data:
3. database.ymlの編集
今回はデータベースにpostgresを利用しています。
database.yml
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: postgres
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
4. 起動
以下のコマンドを実行します。
$ docker-compose build
$ docker-compose run web rake db:create db:migrate
$ docker-compose up
5. 動作確認
上記コマンドを実行後、http://localhost:3000 でアクセスできることを確認しましょう!