CubicLouve

Spring_MTの技術ブログです。https://github.com/SpringMT (http://spring-mt.tumblr.com/ からの移転)

bundlerを使っていて、'/' is not writable. Bundler will use '/tmp/bundrer/home/unknown/' as your home directory temporarily.` と出たときの対応

daemontools経由等で、デーモンのプロセスを立ち上げるときに、プロセス内でbundle exec hogeなどのコマンドを実行すると、

'/' is not writable.
Bundler will use '/tmp/bundrer/home/unknown/' as your home directory temporarily.

のようなwarningメッセージがでます。

これは、HOME が設定されていない環境におけるfallbackのための修正によって発生します。

1.14.5 以降のbundlerを使うと発生します。

https://github.com/bundler/bundler/blob/master/CHANGELOG.md#1145-2017-02-22

github.com

github.com

github.com

原因

下記のようなコードで再現できます(OSはMacです)。

% cat test.rb
p ENV['HOME']
p Gem.user_home

% HOME=/ bundle exec ruby test.rb
`/` is not writable.
Bundler will use `/var/folders/kw/_3kqzwx93nvbbl0h2wk6nkz8bj8f_z/T/bundler/home/hoge' as your home directory temporarily.
"/"
"/"

エラーがでるところはここです。

bundler/bundler.rb at 3203fdd2ad861af2aedfa233b754a02bfc1c4741 · bundler/bundler · GitHub

まずbundleコマンドでbundler自体の設定を行うのですが、bundlerのconfigurationオプションの設定が書かれているファイルから設定を読み込みます。

bundler/settings.rb at 3203fdd2ad861af2aedfa233b754a02bfc1c4741 · bundler/bundler · GitHub

bundler/settings.rb at 3203fdd2ad861af2aedfa233b754a02bfc1c4741 · bundler/bundler · GitHub

このconfigurationオプションの設定とは、

Bundler: bundle config

ここにある設定群になります。

この内容はbundle configで設定した内容が反映されています。

実際の内容はこんな感じです。

% cat .bundle/config
---
BUNDLE_GEM__TEST: "rspec"
BUNDLE_GEM__MIT: "false"
BUNDLE_GEM__COC: "false"
BUNDLE_BUILD__THERUBYRACER: "--with-v8-dir=/usr/local/opt/v8@3.15"
BUNDLE_BUILD__LIBV8: "--with-system-v8"

bundlerのconfigurationオプションの設定があるファイルはglobalとlocalの2つがあります。

localは実行しているカレントディレクトリ/.bundle/config にファイルが設置されています。

globalの場合が今回の問題で、設置されているパスは、環境変数BUNDLE_CONFIGがあれば、 $BUNDLE_CONFIG/.bundle/configになり、なれば$HOME/.bundle/configに設置されています。

ただし、HOMEBUNDLE_CONFIGが設定されていない場合や、HOMEに書込み権限がなければ実際に書込みが発生する際にエラーになっていました。(bundle installbundle updatebundle configを実行した時)

.bundle配下はbundlerの設定やgemのchecksumなどのキャッシュファイルが格納するために必須です。

そこで、HOMEBUNDLE_CONFIGも設定されていない場合や、.bundle配下が書き込めない場合においてtempfileにディレクトリを作成してそこに格納するようにします。

tempfileに格納する際に、warningメッセージがでます。

このメッセージが出た場合

.bundle/configで設定される内容はほとんどがビルドオプションになります。

Bundler: bundle config

bundle installbundle updateを行う場合にはbundlerのンパイルオプション等に影響があるので、要確認です。

ただし、bundle exec 経由でコマンドを実行する場合においては影響がないことがほとんどです。 (特にデーモン化したプロセスでbundler経由でコマンドを呼び出すと、HOMEが/になっているのでこのwarningがでると思います。)

自分で設定した内容を確認して、問題なければwarningをスルーでも大丈夫です。

デーモンでもどうしてもこのwarningを止めたい

bundler binstubを使ってプロジェクトにbundleされた実行可能ファイルを生成してその実行ファイル経由でコマンドを実行してください。

Bundler: bundle binstubs