事象
Docker Imageをクリアした日からCIがエラー終了するようになった
bundle install --clean
が失敗するようになってしまった。
Bundle complete! 62 Gemfile dependencies, 187 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Cleaning all the gems on your system is dangerous! If you're sure you want to
remove every system gem not in this bundle, run `bundle clean --force`.
Service 'xxxx' failed to build: The command '/bin/sh -c bundle install --clean' returned a non-zero code: 15
一度Bundle complete!
と表示されるのだが、その後Cleaning all the gems on your system is dangerous!
としてcode: 15
を返してエラー終了してしまっている。
問題となったコンテナのDockerfile
FROM ruby:2.6.5
ENV RUBYOPT -EUTF-8
ENV LANG C.UTF-8
RUN gem install rails -v 6.0.2
# 以下略
原因
RubyのDocker Imageに入った下記の変更により、BUNDLE_PATHが自動で設定されなくなっていた。
Stop setting `BUNDLE_PATH` by deivid-rodriguez · Pull Request #306 · docker-library/ruby
Dockerfile上ではBUNDLE_PATH
を指定していなかったため、Imageでの設定が削除されたことでBUNDLE_PATH
の指定が空になってしまい、対象がグローバルになってしまった。
だから以下のようなメッセージが表示されたと考えられる。
Cleaning all the gems on your system is dangerous! If you're sure you want to
remove every system gem not in this bundle, run `bundle clean --force`.
しばらくはキャッシュで古いイメージを使っていたため問題が発生しなかったが、キャッシュをクリアしてImageを再取得したことで問題が発生した。
対応
ENV BUNDLE_PATH=$GEM_HOME
をDockerfileに追加することで解消した(上記PRで削除された箇所を、自前のDockerfileに記載する形)。
(最初はdocker-composeファイルのenvironment
に追加したのだがエラーが解消されませんでした。急いでいたので詳しく検証はできていないですが…)