Ruby の公式 Docker イメージでは、1 つのアプリケーションと 1 つの Gemfile のみを使用し、他の gem や Ruby アプリケーションはコンテナー内にインストールまたは実行されないことを前提としています。
コンテナー内に複数の Gemfile をインストールする場合、または単に RubyGems を介して gem をインストールしてシステム gem として使用する場合は、状況が混乱し、バンダーのバグと思われる混乱したエラーが多数発生する原因となってきました。
ただし、これらのエラーは最終的には、Dockerfile がバンダーに バイナリストブ(1 つのアプリケーションと Gemfile にリンクされている)を作成するように指示する方法に由来しています。たとえば、rake
を使用して 2 つの Gemfile をインストールすると、rake
コマンドを実行すると、常に最後にインストールされた Gemfile がロードされ、他の Gemfile はロードされなくなります。
複数の Ruby アプリケーションや gem install
を使用してインストールされたグローバルコマンドを実行できる Docker コンテナを構築するには、Ruby 用の公式 Docker イメージで設定されているデフォルトからいくつかの環境変数を変更する必要があります。
Dockerfile で PATH
と GEM_HOME
を変更して、バンダーがすべての gem を同じ場所にインストールし、コマンドを実行すると、バンダーのアプリケーションロックバイナリストブではなく RubyGems バイナリストブが使用されるようになります。
ENV GEM_HOME="/usr/local/bundle"
ENV PATH $GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH
また、BUNDLE_PATH
と BUNDLE_BIN
の設定を解除する必要があります。Docker で環境変数の設定を解除するのはやや難しい場合がありますが、最も一般的な方法は ENTRYPOINT
スクリプトの最初の部分です。
#!/bin/bash
unset BUNDLE_PATH
unset BUNDLE_BIN
# your script goes here
これで、rake
のように直接呼び出すことで、バンドルなしでコマンドを実行できるようになります。特定のバンドル内のコマンドを実行するには、そのバンドルのディレクトリに cd
してから bundle exec
を使用します。たとえば、アプリケーションバンドル内で rake を実行するには、bundle exec rake
を使用します。