Docs header transparent bg

Docker でバンダーを使用する方法

はじめに

Ruby の公式 Docker イメージでは、1 つのアプリケーションと 1 つの Gemfile のみを使用し、他の gem や Ruby アプリケーションはコンテナー内にインストールまたは実行されないことを前提としています。

コンテナー内に複数の Gemfile をインストールする場合、または単に RubyGems を介して gem をインストールしてシステム gem として使用する場合は、状況が混乱し、バンダーのバグと思われる混乱したエラーが多数発生する原因となってきました。

ただし、これらのエラーは最終的には、Dockerfile がバンダーに バイナリストブ(1 つのアプリケーションと Gemfile にリンクされている)を作成するように指示する方法に由来しています。たとえば、rake を使用して 2 つの Gemfile をインストールすると、rake コマンドを実行すると、常に最後にインストールされた Gemfile がロードされ、他の Gemfile はロードされなくなります。

複数の Ruby アプリケーションと gem の Dockerfile

複数の Ruby アプリケーションや gem install を使用してインストールされたグローバルコマンドを実行できる Docker コンテナを構築するには、Ruby 用の公式 Docker イメージで設定されているデフォルトからいくつかの環境変数を変更する必要があります。

Dockerfile で PATHGEM_HOME を変更して、バンダーがすべての gem を同じ場所にインストールし、コマンドを実行すると、バンダーのアプリケーションロックバイナリストブではなく RubyGems バイナリストブが使用されるようになります。

ENV GEM_HOME="/usr/local/bundle"
ENV PATH $GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH

また、BUNDLE_PATHBUNDLE_BIN の設定を解除する必要があります。Docker で環境変数の設定を解除するのはやや難しい場合がありますが、最も一般的な方法は ENTRYPOINT スクリプトの最初の部分です。

#!/bin/bash

unset BUNDLE_PATH
unset BUNDLE_BIN

# your script goes here

これで、rake のように直接呼び出すことで、バンドルなしでコマンドを実行できるようになります。特定のバンドル内のコマンドを実行するには、そのバンドルのディレクトリに cd してから bundle exec を使用します。たとえば、アプリケーションバンドル内で rake を実行するには、bundle exec rake を使用します。

GitHub でこのドキュメントを編集する場合は、エラーや不足している内容が見つかりました。