docker使用時に以下のエラーについてけっこーハマってしまったので備忘録です。
【環境】
・Ruby 2.7.1
・Rails 6.0.3.4
・Docker
Dockerfile
FROM ruby:2.7.1
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update -qq \
&& apt-get install -y nodejs yarn \
&& mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
現象
チーム開発にてgitに上がっている環境をローカルへclone。
docker-compose up を実行する際にdockerコンテナが落ちてしまう現象がありました。logを確認してみると、以下yarnのエラーがありました。
error Couldn't find an integrity file
error Found 1 errors.
========================================
Your Yarn packages are out of date!
Please run `yarn install --check-files` to update.
========================================
To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).
はじめに、このエラーの対処方法として以下の記事を参考にさせていただき
下記の変更を採用していました。
https://qiita.com/KenAra/items/2708ce3d5c80c4f24920
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: false #yarnチェックしないように変更
無事この対応でdocker起動→rails画面も表示されました。
しかし、安心していたのも束の間でした。
Scaffoldでモデル生成→rails db:migrate
よし、index画面確認してみよう あ..
このエラーの対処法として、下記記事やIssueを参考にさせていただきました。
https://qiita.com/natecotus/items/a2bd9f3ebd5b1866d48e
https://qiita.com/takuma_0625/items/2709f81ffa005fde2188
https://github.com/rails/webpacker/issues/2071
docker-compose web bashでDocker内に入り下記インストールを実行しました。
rails webpacker:install
はい、無事にエラーが解消され、再びrails画面を確認することができました。
上記コマンド実行した際に、何が変更されたか差分を確認してみました。
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: true
これだけでした。しかも・・あれ?戻ってるな・・
yarnのエラー解消した際に変更した内容はなんだったのか。
最初のエラー発生原因が謎になってしまいました。
更に、この対処方法だけだと再度cloneした場合、最初のyarnの問題が再発しそう・・と気付き、気になったので再調査を実施。
下記を参考にさせていただき、再度cloneした別環境で
「Webpacker::Manifest::MissingEntryError」が起きた後に以下コマンドを実行しました。
https://qiita.com/ashketcham/items/48d64e960d436f8b6f78
$ docker-compose run --rm web yarn install
→はい、こちらでも問題が解消できました。
先輩方、ありがとうございます。
なぜ $ rails webpacker:install を実行したことで解決できたのか?
実行時のlogを確認してみたところ理解できました。
webpacker:install実行時にもyarn installを同時に実行していました。
結論へ・・・
この対処法ってdocker-compose runするときにyarn installしているのだから
本件のタイトル
「Please run yarn install --check-files
to update.」
の発生前に
$ docker-compose run --rm web yarn install
を実行してれば問題なかったんじゃないのであろうか。
ということで
→コミット戻して確認しました。
結論
docker-compose up でコンテナ起動せずlogにて以下エラー起きた場合
========================================
Your Yarn packages are out of date!
Please run `yarn install --check-files` to update.
========================================
以下コマンド(docker起動時でのyarn install)を実行で解決できました。
$ docker-compose run --rm web yarn install
原因と感想
読み返してみると。Yarnのパッケージが古いよ!って怒られてますね。
docker runでimage構築→起動時に同時にyarnパッケージを更新すれば良いだけだったようす。
以上です。
以下の2点が確認できたことから
yarn install自体はdocker image,コンテナを作る際に反映されてると推察しました。
・yarn install実行前後をdiffで確認しても環境内のファイルに差分が見つからなかった。
・cloneした環境を起動する際のみ発生する。
※おそらくDockerfile、docker-compose.ymlにYarnが更新できるように書き換えてあげれば、この問題は発生しなさそう。