🍀

Docker で作る最低限の Ruby 開発環境

2022/10/10に公開

概要

Ruby でコードを書くときに rbenv などを使ってディレクトリごとにバージョン管理を行うことがよくありますが、いずれにせよ各バージョンの Ruby をローカル環境にインストールしなくてはなりません。今回はできるだけローカル環境に対して直接何もインストールする必要のない docker コンテナを使って Ruby 実行環境を構築することにしました。その際、シンプルに Ruby ファイルを実行するための最低限の設定を記述した記事があまり見つからなかったので備忘として残すことにしました。

手順

前提として Docker がローカル環境にインストールされていることとします。

まず、作業用ディレクトリを作成します。

$ mkdir hello_ruby
$ cd hello_ruby

次に Docker コンテナの設定ファイルと、実行する Ruby ファイルを作成します。

$ touch Dockerfile
$ touch docker-compose.yml
$ touch app.rb

Dockerfile の中身は以下とします。

FROM ruby:2.7

WORKDIR /app

RUN bundle config path 'vendor/bundle'

ベースイメージは Docker Hub の公式イメージのうちいずれかのバージョンを指定します。
WORKDIR は何でも構いませんが今回はコンテナ内の /app 以下を使うことにしました。
RUN bundle config path 'vendor/bundle' はプロジェクトのディレクトリ内に RubyGems をインストールするために記述します。

続いて docker-compose.yml は以下です。

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - type: bind
        source: ./
        target: /app

volumes の指定は Docker コンテナの /app がホストのカレントディレクトリ(./)を参照することを指定しています。こうすることで、コードを変更した際にイメージをビルドし直す必要がなくなります。

※ マウントタイプについては https://docs.docker.jp/storage/bind-mounts.html に詳しくあります。

今度は RubyGems を使うための設定していきます。以下を実行すると

$ docker-compose run --rm app bundle init

作業ディレクトリに Gemfile が作成されます。中身は以下のようになっていると思います。

# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"

必要な RubyGems がある場合はここに追記します。
bundle install を実行して Gemfile に記述した RubyGems をインストールします。

$ docker-compose run --rm app bundle install

上記を実行すると作業ディレクトリに vendor/bundle ディレクトリと Gemfile.lock が自動で作成されます。vendor/bundle ディレクトリには RubyGems がインストールされますが、これは先程 DockerfileRUN bundle config path 'vendor/bundle' を記述した結果、この作業ディレクトリ配下にインストールされることになっています。Gemfile.lock はこれら RubyGems の依存関係を解決しています。

今回はインストールする RubyGems はないので何もインストールされません。

これで docker-compose を使った実行環境はできたので Ruby ファイルに簡単なスクリプトを記述して実行します。

app.rb は単純なメソッドを呼び出すだけとします。

# frozen_string_literal: true

def hello_ruby
  puts "Hello Ruby"
end

hello_ruby

これで準備はできたので実際に app.rb を実行します。まず先程作成した Dockerfile からイメージをビルドします。

docker-compose build

次にこのイメージを使って app.rb を実行します。

docker-compose run --rm app bundle exec ruby app.rb

すると

$ docker-compose run --rm app bundle exec ruby app.rb
Creating hello_ruby_app_run ... done
Hello Ruby

Hello Ruby と標準出力が出ると思います。これで完了です。

まとめ

今回は Docker を使って Ruby スクリプトを簡単に開発、動作検証できる最低限の環境構築手順を記載してみました。個人的にローカル環境にミドルウェアをたくさんインストールするのが好きではないので Docker が好みなのですが毎回どこかしらに詰まってるので備忘として残してみました。

参考

Discussion