3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-01

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

#はじめに

$docker-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 によって管理されます。

と記載されている。
詳しいことはボリュームの利用で確認してほしい。

本編に話を戻す。
編集前の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する
Zero to Up and Running a Rails Project only using Docker
ボリュームの利用(docker docs)

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?