Docker で作る最低限の Ruby 開発環境
概要
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
がインストールされますが、これは先程 Dockerfile
に RUN 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