LoginSignup
0
0

More than 1 year has passed since last update.

dockerを使うときは常にdockerコマンドを使う

Posted at

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で実行しているのか常に意識するようにしましょう。

0
0
0

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
0
0