概要
Docker composeを使用する際に出現する'docker compose run'コマンドと'docker compose exec'コマンドについて違いを簡単にまとめてみました。
今回使用する環境情報
- macOS
- Docker Desktop
- Ruby 3.3
Docker環境の構成
今回は以下のようなフォルダ構成で検証します
project/
├── docker-compose.yml
└── Dockerfile
dockerfile
FROM ruby:3.3
WORKDIR /app
COPY Gemfile* ./
RUN bundle install || true
COPY . .
CMD ["irb"]
docker-compose.yml
version: "3.9"
services:
ruby:
build: .
container_name: ruby_app
volumes:
- ./app:/app
working_dir: /app
tty: true
stdin_open: true
検証
実際にこの環境を使ってrunとexecを使った場合のコンテナの立ち上がり方の違いを見てみます。
まずはコンテナを起動します。
docker compose up
起動中のコンテナを確認します。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8bc7a959b05b test_docker-ruby "irb" About a minute ago Up About a minute ruby_app
今一つのコンテナが起動している状態です。
runコマンドの場合
この状態で、
docker compose run ruby bash
と実行すると
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7adabb4ee676 test_docker-ruby "bash" 3 seconds ago Up 3 seconds test_docker-ruby-run-f93d667dc83e
8bc7a959b05b test_docker-ruby "irb" About a minute ago Up About a minute ruby_app
exitでコンテナから抜けると
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8bc7a959b05b test_docker-ruby "irb" 42 minutes ago Up 42 minutes ruby_app
この挙動を見ると、runコマンドは一時的に新しいコンテナを立ててそのコンテナに入ることがわかります。
execコマンドの場合
では、execを実行すると
docker compose exec ruby bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8bc7a959b05b test_docker-ruby "irb" 47 minutes ago Up 47 minutes ruby_app
となり、execコマンドはすでに立っているコンテナに入ることがわかります。
まとめ(結論)
| コマンド | 動作 | 用途 |
|---|---|---|
docker compose run |
一時的に新しいコンテナを立ち上げて入る | テスト実行・一回限りの処理 |
docker compose exec |
既存のコンテナに入る | 稼働中のアプリに接続・確認 |
結論
- compose run 一時的に新しいコンテナを立てそこに入る
- compose exec 既存のコンテナに入る
この記事が「run と exec の違い」を整理する助けになれば幸いです