[Rails][docker]Please run `yarn install --check-files`を解決する

### docker使用時に以下のエラーについてけっこーハマってしまったので備忘録です。

## 【環境】
・Ruby 2.7.1
・Rails 6.0.3.4
・Docker

## Dockerfile

```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).
```
<font color="Red">
※対処方法/結論に急ぎたい方は一番下までスクロールしてください。（長いので）
</font>

はじめに、このエラーの対処方法として以下の記事を参考にさせていただき
下記の変更を採用していました。
https://qiita.com/KenAra/items/2708ce3d5c80c4f24920

```config/webpacker.yml
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: false  #yarnチェックしないように変更
```

無事この対応でdocker起動→rails画面も表示されました。

![スクリーンショット 2020-11-15 16.47.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603311/e1269c16-2d0f-4512-3538-b48d53903e78.jpeg)

しかし、安心していたのも束の間でした。

Scaffoldでモデル生成→rails db:migrate
よし、index画面確認してみよう　あ..

![スクリーンショット 2020-11-09 15.02.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603311/39146787-135f-1943-d81b-0f542a867725.jpeg)


このエラーの対処法として、下記記事や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画面を確認することができました。

上記コマンド実行した際に、何が変更されたか差分を確認してみました。

```config/webpacker.yml
# 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パッケージを更新すれば良いだけだったようす。


以上です。

以下の２点が確認できたことから
yarn install自体はdocker image,コンテナを作る際に反映されてると推察しました。
・yarn install実行前後をdiffで確認しても環境内のファイルに差分が見つからなかった。
・cloneした環境を起動する際のみ発生する。

※おそらくDockerfile、docker-compose.ymlにYarnが更新できるように書き換えてあげれば、この問題は発生しなさそう。