Could not find mini_portile2-2.5.0 in any of the sourcesとなった際の対処法

#開発環境
Rails 6.0.3.6
Ruby 2.6.5
Docker　20.10.0-rc1

#はじめに
```
$ｄocker-compose up 
```
でコンテナを立ち上げようとすると、

```
web_1  | Could not find mini_portile2-2.5.0 in any of the sources
web_1  | Run `bundle install` to install missing gems.
tmmanager_web_1 exited with code 7
```

となり、コンテナを立ち上げられない。
今回は、この対処法を書いていこうと思う。

##対処法
結論から言うと、volumeの永続化ができていないため、今回のエラーが生じたとされる。
ちなみに、docker docsの公式には、

>ボリュームとは、Docker コンテナーにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組みです。 バインドマウント はホストマシン OS のディレクトリ構造に依存しますが、ボリュームは完全に Docker によって管理されます。

と記載されている。
詳しいことは[ボリュームの利用](https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/#:~:text=%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%81%A8%E3%81%AF%E3%80%81Docker%20%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%83%BC,Docker%20%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%AE%A1%E7%90%86%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)で確認してほしい。

本編に話を戻す。
編集前の```docker-compose.yml```は以下の通りだ

```docker-compose.yml
#docker-composeのバージョン
version: '3'
services:
  db:
    image: postgres:13.1
    ports:
      - '5432:5432' # ホストからゲストへポートフォワード
    volumes:
      - postgresql-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: test_db
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: /bin/sh -c "rm -f tmp/pids/server.pid &&  bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/myproject # ソースコード変更したらDocker側も即反映されるように
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
  postgresql-data:
    driver: local
```

上記のファイルに下記の編集を加える

```docker-compose.yml
#docker-composeのバージョン
version: '3'
services:
  db:
    image: postgres:13.1
    ports:
      - '5432:5432' # ホストからゲストへポートフォワード
    volumes:
      - postgresql-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: test_db
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: /bin/sh -c "rm -f tmp/pids/server.pid &&  bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/myproject # ソースコード変更したらDocker側も即反映されるように
      - bundle_path:/bundle #(追加箇所)
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
  bundle_path:　#(追加箇所)
  postgresql-data:
    driver: local
```

### その後の手順
```docker-compose.yml``` を編集した際は、

``` 
$ docker-compose run --rm web bundle install
```
を実行する。

そして、

``` 
$ docker-compose up  
```
を実行する（docker-compose up -dでも可）。
これでvolumeの永続化ができるようになった。

###補足
当たり前かもしれないが、一度dockerコンテナを作成すると、

```
$ rails s
 ```
でローカルの環境を起動する必要はない。これは、```$docker-compose up``` で勝手に```$rails s```をやってくれるからである。

そもそも、```$rails s```はホストPCのrails gemで立ち上げてることになるため
必然的にエラーが出る。　そのため、docker環境でサーバーを起動する際は、```$rails s```ではなく、docker-composeを使ってwebコンテナに対してコマンドを実行することになる。
そのため、bundle installをしたいのであれば

```
$ docker-compose run --rm web bundle install
```
マイグレーションをかけたいのであれば

```
$ docker-compose run --rm web bundle exec rails db:migrate
```
を実行すればいい。

###おわりに
この記事で間違っている箇所がありましたら、教えていただけると幸いです。
ありがとうございました。

###参考記事
[【Docker】Railsでgemをcacheする](https://qiita.com/k-penguin-sato/items/d51f09376f5733bb3ae9)
[Zero to Up and Running a Rails Project only using Docker](https://blog.codeminer42.com/zero-to-up-and-running-a-rails-project-only-using-docker-20467e15f1be/)
[ボリュームの利用（docker docs）](https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/#:~:text=%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%81%A8%E3%81%AF%E3%80%81Docker%20%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%83%BC,Docker%20%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%AE%A1%E7%90%86%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)