Docker環境でCould not find 'bundler'のエラーが出た時の対処法

背景

久しぶりにあるRailsアプリケーションのローカル開発環境を動作させようとしました。git pullした後にdocker-compose upとすると、

1
2
3
4
5
6
7
Traceback (most recent call last):
2: from /usr/local/bin/bundle:23:in `<main>'
1: from /usr/local/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
/usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.2.15) required by your /app/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.2.15`
!! exit status 1

というエラーが発生してしまいました。その時の対応を記載します。

bundlerのバージョンアップを試す

gem install bundler

バージョン変更があったのか、とりあえず言われた通りgem install bundlerを実行してみます

1
2
3
4
5
6
7
8
9
10
11
12
$ docker-compose run --rm web gem install bundler
Creating app_web_run ... done
Traceback (most recent call last):
2: from /usr/local/bin/bundle:23:in `<main>'
1: from /usr/local/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
/usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.2.15) required by your /app/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
...
(中略)
...
To install the missing version, run `gem install bundler:2.2.15`
!! exit status 1

メッセージは変わりません…

bundle update –bundler

もう1つの方法、bundle update —bundlerを行なってみましょう

1
2
3
4
5
6
7
8
9
$ docker-compose run --rm web bundle update --bundler
Creating app_web_run ... done
Traceback (most recent call last):
2: from /usr/local/bin/bundle:23:in `<main>'
1: from /usr/local/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
/usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.2.15) required by your /app/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.2.15`
!! exit status 1

変わりません…

ローカルのRubyの確認

DockerではなくローカルのRubyのバージョンを確認してみます

1
2
3
4
$ ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin17]
$ cat .ruby-version
2.7.2

コンテナ内のバージョンとはあってないみたいですね…
Bundlerのバージョンも確認します

1
2
$ bundler --version
Bundler version 2.1.4

Gemfileに記載のバージョンとは異なるようです。updateできるか試してみます。

1
2
$ bundle update --bundler
Warning: the running version of Bundler (2.1.4) is older than the version that created the lockfile (2.2.15). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.2.15`.

ローカルもできないようです

コンテナのbundlerのバージョンを更新する
一旦すべてのイメージとボリュームを削除することにしました

1
2
3
4
5
6
7
8
$ docker-compose down --rmi all --volumes
Removing app_web_1 ... done
Removing app_db_1 ... done
Removing network app_default
Removing volume app_mysql-data
Removing volume app_bundle
Removing image mysql:5.7
Removing image app_web

削除ができたのでdocker-compose upします

1
2
3
4
5
6
7
8
9
10
11
12
13
docker-compose up
Creating network "app_default" with the default driver
Creating volume "app_mysql-data" with default driver
Creating volume "app_bundle" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
...
(中略)
...
Step 1/14 : FROM ruby:2.7.2
2.7.2: Pulling from library/ruby
004f1eed87df: Pull complete
5d6f1e8117db: Pull complete

ruby:2.7.2のベースイメージからコンテナをビルドしていることがわかります
この後bundle installも終わって無事起動しました

まとめ

コンテナでバージョンの不一致が発生したら、以下のコマンドで一旦コンテナを削除する

1
docker-compose down --rmi all --volumes

MySQLのデータ(データベース、テーブルなど)も全てなくなるので注意が必要です

ローカルのRubyバージョンとコンテナのバージョンの問題を混同しないように気をつけないといけません
この切り分けがはっきりしていないと間違った方向に進んでしまいます

あとから思ったのですが、コンテナを再ビルドすれば大丈夫だったかもしれません

1
docker-compose build

Dockerfileが変更されているはずなのでこちらでも必要なコンテナイメージの再ビルドが行われたと思います