まだ完全には理解できていないけど、忘れないうちにメモ
docker-compose run --rm web bundle install
を実行してbundle installが成功したにも関わらず、なぜかrubocopを実行するとbundle installしろと怒られる・・・
$ docker-compose run --rm web bundle exec rubocop
Creating project_web_run ... done
Could not find regexp_parser-2.7.0 in any of the sources
Run `bundle install` to install missing gems.
ただしコンテナ内に侵入してbundle installしてからrubocopを実行したら問題なし
どこで何がどうなっているのかさっぱりわからないw
迷っていたらうちのマネージャーが教えてくれました!
まずはこの2種類があるんだよと
docker-compose run --rm web bundle install
docker-compose exec web bundle install
大雑把には
run --rm
の方はコンテナを作って処理を流してから削除されるので、一時的な処理を流すのに適している
exec
の方は今起動しているコンテナに処理を流している
なので、exec
は起動していない時に実行したらエラーになる
$ docker-compose exec web bundle install
ERROR: No container found for web_1
コンテナの中で実行してうまくいったのはexec
と同じ
なんとなくわかった!
ChatGPTさんで復習
復習するにもrun --rm
とexec
という似て非なるものがあるということを知らなかったので、自分で調べてたらこの質問には辿り着けなかっただろうな
Docker Compose において、run --rm と exec の主な違いは以下のとおりです。
run --rm:新しいコンテナを実行し、そのコンテナが終了したら自動的に削除されます。
exec:既存のコンテナ内で新しいプロセスを実行します。
具体的には、run --rmはコンテナを起動し、その中でコマンドを実行して終了するまで待ちます。そして、コマンドが完了したら、Docker はコンテナを削除します。この方法は、一時的にコンテナを実行する必要がある場合に便利です。
一方、execは既存のコンテナに接続し、その中で新しいコマンドを実行します。これは、既に実行中のコンテナ内で作業する必要がある場合に便利です。また、execは、実行中のコンテナに対して、追加のコマンドを実行することができます。これにより、コンテナ内で複数のコマンドを実行できるようになります。
簡単に言えば、run --rmは新しいコンテナを起動するためのものであり、execは既存のコンテナに接続して作業するためのものです。
ChatGPTもすげーし、うちのマネージャーもすげーw