使用Docker时,始终使用Docker命令
Docker在与主机环境分离的另一个环境中运行。
例如,如果您使用Docker来构建Rails应用程序的开发环境,那么应用程序将在一个与宿主机不同的容器中进行构建和执行。
宿主机上的Ruby和Docker容器中的Ruby是不同的,gem的安装位置也不同。
当主机和容器都安装了Ruby时,两者都能运行命令。
主办方 (Zhǔ
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
这个也会安装在容器中。
如果在docker compose中进行了卷同步,则会同步到主机上。
但是,与在主机上进行bundle install不同,它将同步到不同的位置,
因此无法从主机上的位置引用。
意思是要注意命令的执行环境。
如果您在使用docker进行开发,那么请始终通过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 上执行。