Dockerを使用してRuby+MariaDBの環境構築

Ruby on Railsの勉強をするにあたりrenv等を使用しローカルに作るのではなく、Docker上でRubyの開発をしたい、、ということでDockerを使用してRuby+MariaDBの環境構築を行いました。

Rubyのバージョン確認

作成するにあたりRubyのバージョンを確認します。
以下のURLから探しましょう。

ruby - Official Image | Docker Hub
Ruby is a dynamic, reflective, object-oriented, general-purpose, open-source programming language.

RubyのDockerイメージを見るとこの記事を書いた時点(2020/11/02)では2.7.2が使えそうなのでそちらを使用していきます。

Ruby on Railsの環境構築について

探していたところ以下のURLにQuickStartがあったのでそちらを参考に構築していきます。

404 Page not found

環境構築

ファイル作成

まずは適当なフォルダを作りDockerやRuby on Railsに必要なファイルを作成していきます。
作成するファイルは以下の5つです。

  • Dockerfile
  • docker-compose.yml
  • Gemfile
  • Gemfile.lock
  • entrypoint.sh

とりあえず全て空ファイルで作成します。

次に、それぞれのファイルの役割の確認と内容を記述していきます。

Dockerfile

コンテナを作成するためのベースとなるDockerイメージおよびそのベースイメージに対するタスクを記述したファイルです。
今回はRuby 2.7.2をベースに必要になるパッケージなどをインストールしていきます。
そいて後述のentrypoint.shをエントリーポイントとして起動します。

FROM ruby:2.7.2
RUN apt-get update -qq && apt-get install -y nodejs default-libmysqlclient-dev
# yarnのバージョンでエラーが出る対策
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install yarn
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

複数のコンテナをまとめて記述することができ、システム(コンテナ郡)を簡単に構築することができます。
今回は先ほど出てきたDockerfileを元にするwebサービスとMariaDbのdbサービスの二つを起動します。

version: '3'
services:
  db:
    image: mariadb:10.4.14
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=sample
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

Gemfile

gemを管理するファイルです。
初期状態ではRuby on Railsの6がインストールされるようになっています。
(このフォルダにインストールされるため、このGemfile自体はRailsのインストールで書き換わります。)

source 'https://rubygems.org'
gem 'rails', '~>6'

Gemfile.lock

gemをインストールした際のバージョンを固定するためのファイルです。
例えばGemfileで6以上となっていた場合に6.0も6.1も対象になるのですが、このGemfile.lockで6.1と固定されていれば、gemをインストールした際には6.1がインストールされるようになります。
今回は、初期状態では固定する必要がないので空ファイルのままで問題ありません。

entrypoint.sh

サーバを起動するためのシェルスクリプトです。
Dockerfileから受け取ったコマンドを実行します。(今回の場合はCMD [“rails”, “server”, “-b”, “0.0.0.0”]→$@となる)

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

Ruby on Railsプロジェクトの作成

ファイルの作成が完了次第、Ruby on Railsのプロジェクトを作成していきます。
ターミナル等で以下コマンドを実行していきます。

docker-compose run --no-deps web rails new . --force --database=mysql

完了するとRuby on Railsプロジェクトのファイルがたくさん作成されます。

Dockerイメージの再ビルド

Gemfileが書き換わっているので、Dcokerを再ビルドします。
(別途コマンド叩くでもいける気がしますが、手順書通りに。。)

docker-compose build

DB接続情報の修正

config/database.ymlを書き換えます。
書き換え箇所としては、とりあえずdefaultのusernameとpassword、hostを変更します。
また、develop、testデータベース名もとりあえず修正しておきます。
(必要であればproductionも変更してください。また、必要に応じてrootではなくuserを使用してください。)

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root
  host: db
development:
  <<: *default
  database: sample_development
test:
  <<: *default
  database: sample_test

webpackerインストール

Ruby on Railsの6からwebpackerが必要らしいのでインストールします。
以下のコマンドを実行します。

docker-compose run web bundle exec rails webpacker:install

Dockerイメージ起動

ここまでで準備は完了なのでDockerを立ち上げます。
以下のコマンドで立ち上げることができます。

docker-compose up

DB作成

Dockerイメージ作成時にsampleデータベースは作成されているはずですが、テストのデータベースはないので、Railsから作成します。

docker-compose run web rake db:create

これで環境構築は完了です。

動作確認

「http://localhost:3000」にアクセスをして問題なくRuby on Railsの起動画面が表示されていれば完了です。

これで思う存分Rubyを勉強できます。

コメント

タイトルとURLをコピーしました