こちらの記事で 「docker-composeを使ったRailsアプリ開発では、Gemfileを更新したときbuildしなおす必要がある」 ということがわかったのですが、理由が腑に落ちなかったので調べました。
buildとupの違い
up
$ docker-compose up
コンテナを作成して起動するコマンドです。
既にコンテナが起動中の場合、コンテナを再起動します。
このコマンドは、docker-compose.ymlを更新した場合は差分をキャッチして設定や利用するイメージを変更してくれます。
build
$ docker-compose build
「web」や「db」など、docker-compose.ymlに記述されている サービスのbuildを実行します。
ymlにimage:が書かれている場合はそのイメージをリモートからpullします。既にリモートにイメージがpullされている場合はそちらを利用します。
imageが書かれていない場合は、buildに書かれているパスのDockerfileを参考にしてイメージをbuildします。
Gemfileを更新したするときにbuildし直す理由
Gemfileを変更したときはイメージをbuildし直す必要があるようです。
この理由は、Dockerfileを読んだらわかりました。
1 FROM ruby:2.4.2
2 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
3 RUN mkdir /myapp
4 WORKDIR /myapp
5 ADD Gemfile /myapp/Gemfile
6 ADD Gemfile.lock /myapp/Gemfile.lock
7 RUN bundle install
8 ADD . /myapp
5行目でGemfileをADDしています。
Gemfileを更新したときは、この部分をやり直す必要があったんですね...
参考
buildし直すのが面倒な場合、docker-compose.ymlに設定を記述して回避することもできるそうです。