はじめに
学習中にDockerを使用している際、
「docker composeは分かるが、次に続くexecとrunってどういう意味?」と疑問に感じたので調べてまとめたことを備忘録として記事にします。
目次
- docker compose execについて
- docker compose runについて
- この2つはどう使い分ければよい?
- まとめ
docker compose execについて
Docker Compose環境で起動中のコンテナに対してコマンドを実行します。
docker compose exec [オプション] <サービス名> <コマンド>
例としてRailsを用います(オプションは必須じゃないです)
docker compose exec web rails 〇〇
そもそも... Docker Composeってなんだ?
簡単に説明すると...
- 複数のDockerコンテナを一つのコマンドで立ち上げることができる
- Docker CLI(コマンドラインインターフェース)の拡張機能として動作する
プログラムのこと - docker-compose.ymlで設定されたサービスを操作する
docker compose runについて
Docker Compose環境でコンテナが起動していなくてもコマンド入力が可能で、
新規のコンテナを作成してコマンドを実行します。
記述方法もexecと似ています。
docker compose run [オプション] <サービス名> <コマンド>
この2つはどう使い分ければよい?
このexecとrunの2つのはどのように使い分ければよいのでしょうか?
前項の各説明での下線部分に注目します。
- docker compose exec
起動しているコンテナに対してコマンドを入力するため、
既存の環境に直接コマンドを入力する場合。 - docker compose run
既存のコンテナには触れずに新規でコンテナを追加するため、
一時的な作業(マイグレーション・初期設定・テスト等)をする場合。
execは、確実に実行できる場合でrunのように回り道をせずに
すぐにコンテナに適用したい場合で有効。
runはコンテナが起動していないので、
コンテナ起動前にbundle installをし、問題がなければ
コンテナを起動して同期させるというコマンド入力直後のトラブル防止になる。
まとめ
| docker compose exec | docker compose run | |
|---|---|---|
| コンテナの状態 | 既に起動中 | 起動していなくてもよい |
| 処理の影響 | 対象コンテナに直接処理を実行 | 新規でコンテナを作成して実行 現在のコンテナは影響しない |
| 使い分け | すぐに適用させたい エラーが無く確実に実行可能な処理 |
一時的または試験的な処理 |
おわりに
execとrunは使用用途に応じて使い分けることが重要ですね。
不安な処理であれば一度runで確認し、問題がなければexecで本番環境に適用させるといった流れも可能です。
まだまだDockerは奥が深い...!!