Dockerとdocker-composeを使い、Rails6をAPIモードで動かす環境を構築しました。最後に動作確認もしています。
前提
Docker & docker-composeをインストール済み
動作環境
- macOS Catalina 10.15.7
- Ruby 2.7.1
- Ruby on Rails 6.0.3
- Docker 20.10.2
- docker-compose 1.27.4
ディレクトリを作成します。
mkdir rails_api_docker
cd rails_api_docker
GemfileとDockerfileを作成します。
source 'https://rubygems.org'
gem 'rails', '6.0.3'
FROM ruby:2.7.1-alpine3.11
ENV BUNDLER_VERSION=2.1.4
WORKDIR /usr/src/app
COPY Gemfile .
COPY Gemfile.lock .
RUN apk update && \
apk add --no-cache \
shared-mime-info \
linux-headers \
libxml2-dev \
curl-dev \
make \
gcc \
libc-dev \
g++ \
sqlite-dev \
tzdata && \
gem install bundler && \
bundle install
COPY . .
EXPOSE 3000
インストールするbundlerのバージョンを指定するためにENV
で環境変数を定義しています。
Dockerfileを元にDockerイメージを作成します。
docker build -t rails_api:6.0.3 .
作成したイメージからコンテナを起動し、Railsアプリケーションを作成します。
docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app rails_api:6.0.3 rails new . --skip-keeps -M -C -S -J -B
オプション | 説明 |
---|---|
--skip-keeps | .keepファイルを作成しない |
-M | Action Mailer, Action Mailbox, Action Text関連のファイルを作成しない |
-C | Action Cable関連のファイルを作成しない |
-S | Sprockets, Spring, listenを使用しない |
-J | JavaScript, turbolinksを使用しない |
-B | bundle installを実行しない |
docker-compose.yml
を作成します。
version: '3'
services:
api:
build: .
ports:
- '3000:3000'
volumes:
- .:/usr/src/app
tty: true
command: ["rails", "server", "-b", "0.0.0.0"]
docker-composeでコンテナを起動します。
docker-compose up
localhost:3000
にアクセスします。起動画面が表示されれば成功です。
APIの動作確認
起動中のコンテナにログインします。
docker-compose exec api sh
今回は簡単にするためscaffold
を使ってcontrollerとmodelを作成します。
rails g scaffold User name:string
/db/seeds.rb
に以下を追記してテストデータを作成します。
User.create name: "Euclid"
DBを初期化し、テストデータを反映させます。
rails db:create
rails db:migrate
rails db:seed
/app/controllers/users_controller.rb
のindexアクションを以下に変更します。
def index
@users = User.all
render json: @users
end
localhost:3000/users
にアクセスして以下が表示されれば成功です。
読んでいただきありがとうございました!ご指摘やご意見などありましたらコメントしていただけると嬉しいです🐳