環境
OS:macOSMojave
バージョン管理:rbenv
ruby version: 2.6.0
##症状
自分はDocker環境でこの事象が発生しましたがDocker環境以外でも同じ問題でつまづいたことがあります。その時とはややエラーの内容が異なりましたので別の解決方法で解決しました。
その際に参考にしたのはこちらの記事で解決させていただきました。
エラーの内容がld: library not found for -lssl
で止まってしまっている場合などは上記の記事で解決できると思います。
今回の事例は
$ docker-compose run --rm app ./bin/bundle install --path vendor/bundle
Dockerでbundle install
をしようとしたら
Errno::EACCES: Permission denied @ rb_sysopen -
/app_name/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/CHANGELOG.md
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before
bundling.
というエラーで弾かれてしまいました。
原因
Permission denied
と出てるのでどうやら権限周りの問題が原因になってそうです。
まず最初に疑ったのはrbenvではなくsystemのrubyやgemを使っているのではないかと思い確認してみました。
$ which ruby
/Users/username/.rbenv/shims/ruby
$ which gem
/Users/username/.rbenv/shims/gem
どうやらrbenvで管理されているのでこれは問題なさそう。
そしてめげずに調べたらこんな記事がありました。
確かに前にsudoつけて色々インストールした記憶があるなと思い色々な箇所の権限を確認してみましたが問題になってるのは上記のエラー内容に記載されてる/app_name/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/
以下っぽい。
コマンドで権限を確認してみる
$ ls -ltr vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2
total 64
-rw-r--r-- 1 root staff 87 4 5 22:17 CHANGELOG.md
-rw-r--r-- 1 root staff 1078 4 5 22:17 LICENSE
-rw-r--r-- 1 root staff 24534 4 5 22:17 README.md
drwxr-xr-x 4 root staff 128 4 5 22:17 examples
drwxr-xr-x 3 root staff 96 4 5 22:17 ext
drwxr-xr-x 4 root staff 128 4 5 22:17 lib
drwxr-xr-x 10 root staff 320 4 5 22:17 spec
drwxr-xr-x 6 root staff 192 4 5 22:17 support
やはりinstall時にsudoをつけてしまっていたみたいですね。。。。
解決策
先ほどの記事内の手順に沿って
$ sudo chown -R (ユーザー名):staff vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2
を実行し、ディレクトリの権限をユーザーに戻す。
そして再度
$ docker-compose run --rm app ./bin/bundle install --path vendor/bundle
すると
Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
無事にインストールができました。
自分は普段はiOS,Androidが専門なので中々つまづきましたが今後サーバーサイドも結構やることがありそうなので忘備録として書きました。