#開発環境
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のバージョン
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のバージョン
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)