はじめに
この度共同開発を行う機会を頂き、共同開発用の環境構築を行うこととなりました。
そこでbundlerのバージョンを2.1.4に固定する必要があったのですが、一般的にbundlerをバージョン変更する方法を行ってもbundlerのバージョンが変更されませんでした。__デバイス間の差異などに左右されない__ことからDockerで環境構築を行いたかったのでDocker上でGemfile.lockのBUNDLED WITHを変更する方法を模索しました。
以下、バージョン変更のために行った方法(後に説明しますが、この記事を書いている方が間違っているというわけではないです。むしろほとんどの場合はこれで解決するのではないかと個人的には思います。)
この記事の対象者
- 何らかの事情があり、docker上でGemfile.lockのBUNDLED WITHを変更する必要がある方
構築する環境
- Ruby 2.5.1
- Rails 5.2.4
- bundler 2.1.4
- PostgreSQL 12.4
結論
アプリ側のDockerfileでBUNDLER_VERSIONを上書きする
※Ruby用のDockerイメージが新しいバージョンの場合は先ほどの記事の通りにやっていただければ解決すると思います。
具体例
FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
ENV BUNDLER_VERSION 2.1.4 #ここにバージョンを記載する!!
RUN gem install bundler -v 2.1.4 #bundlerのバージョンを指定する!!
RUN bundle update --bundler
RUN bundle install
COPY . /myapp
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
なぜBUNDLER_VERSIONを指定する必要があるのか?
調べてみたところ、BUNDLER_VERSION という環境変数でバージョンが指定されている場合、強制的にそのバージョンが使われるという情報を得ました。また、Docker Hub の提供している Ruby 用の Docker イメージ側で、BUNDLER_VERSION を指定しているということを知りました。
引用元:https://r7kamura.com/articles/2019-01-26-docker-bundler-2-0
とのことでした。
ちなみに引用元の記事が書かれたのが2019年の1月でして、その時点で「最近この問題が解消された(Docker イメージ側では BUNDLER_VERSION を指定しなくなった)」と書いているので、Gemfile.lockのBUNDLED WITHが更新されない問題は__古いバージョンでのみ起こる可能性が高そうで__すね。
[Dockerイメージ ruby 2.5.1の画像]
(https://gyazo.com/5a5974ec36ffc54e47aeac6b03affd35)
こちらを見ていただくと、BUNDLER_VERSION = 1.16.6と指定されているのがわかると思います。
ちなみにruby 2.6.6ではBUNDLER_VERSIONは確認できなかったので、少なくともruby 2.6.6以上ではこの問題は起きなさそうですね!
最後に
もし、Docker上でGemfile.lockのBUNDLED_WITHを変更できない場合は一度使用しているDockerイメージを確認してみる必要がありそうですね!
この記事が役に立ったと感じたらLGTMをいただけると幸いです。