dockerはホストとは別の環境で実行される
たとえばRailsのアプリケーションの開発環境をdockerで構築している場合は、ホストとは別の環境であるコンテナでアプリケーションが構築、実行されます。
ホストのrubyとdockerコンテナのrubyは別ですし、gemのインストール先も異なります。
ホストとコンテナの両方にrubyが入っているとどちらもコマンドが通ります。
ホスト
ruby -v
ruby 3.1.0
コンテナ
docker compose run --rm web ruby -v
ruby 3.1.0
ruby -v
のようなバージョン確認コマンドならたいして問題になりませんが、bundle install
のような
gemのインストールの場合は問題が起こります。
ホスト
bundle install
ホストで実行すると当たり前ですが、ホストにインストールされます。
コンテナ
docker compose run --rm web bundle install
こちらも同様にコンテナにinstallされます。
docker composeでvolumeしている場合はホストに同期されますが、
ホストでbundle install
した場合とは異なる場所に同期されるため、
ホストから参照できる場所ではありません。
コマンドの実行環境を意識する
dockerで開発をしている場合は常にdocker
コマンド,composeを使っている場合はdocker compose
コマンド経由で
コマンドを実行するようにしましょう。
例:
docker compose run --rm web bundle install
ホストで以下のようにコマンドを実行しても、dockerでbundle installは実行されていないのでgemを利用することはできません。
bundle install
プログラミングの時はググっていろいろな記事を参考にすると思います。
参考にした記事やドキュメントに「bundle install
を実行しましょう」と書いてあるからといって
自分の環境でもそのまま使用できるとは限りません。
実際にrailsの開発ではよく使われているdeviseのREADMEにbundle install
を実行するように書いてあります。
RailsしかりWeb系の開発でdockerはデファクトスタンダードになっていますが、READMEはdockerを前提として書いてはいません。
dockerを使っている場合はdocker compose run --rm web bundle install
(webの部分はdocker-compose.ymlのservice名と合わせる必要あり)と読み替える必要があります。
ホストで実行しているのか、dockerで実行しているのか常に意識するようにしましょう。