コンテナ内でコマンド実行したい(docker compose exec

$ docker compose exec <サービス名> <コマンド>

docker compose execは、compose.yamlで管理しているコンテナの中でコマンドを実行できるコマンドです。

<サービス名>compose.yamlservices:セクションで定義したコンテナの名前です。 <コマンド>は、コンテナ内で実行したいシェルコマンド(例:lsbashpython script.pyなど)です。

注釈

コンテナが起動していないとexecは使えません。 あらかじめdocker compose up -dで起動しておく必要があります。

実行ユーザーを変更したい(--user

$ docker compose exec --user USERNAME <サービス名> <コマンド>

--userオプションで、コマンドを実行するユーザーを変更できます。 デフォルトはrootもしくはDockerfileで指定されたUSERです。

多くの公式イメージでは、デフォルトでrootユーザーとして動作するため、とくに指定する必要はありません。 ただし、セキュリティの観点から、rootではないユーザーを使うように設計されているイメージもあります。

$ docker compose exec <サービス名> whoami

whoamiコマンドを実行すると、 実際のコンテナがどのユーザーで動いているか確認できます。

パイプしたい(-T / --no-tty

$ docker compose exec -T <サービス名> <コマンド> | <ホストPC上でのコマンド>

-T--no-tty)は、仮想端末(TTY)を割り当てないようにするオプションです。

TTY(teletypewriter)は対話的なターミナルセッションのことで、デフォルトではコンテナに割り当てられます。 パイプで出力を別のコマンドに渡す場合は、-Tオプションで TTY を無効にする必要があります。

// MySQLコンテナのDBを、ホスト側にダンプする
$ docker compose exec -T db mysqldump -uUSERNAME -pPASSWORD --single-transaction DATABASE > dump.sql

// gzip圧縮する
$ docker compose exec -T db mysqldump -uUSERNAME -pPASSWORD --single-transaction DATABASE | gzip > dump.sql.gz

上記コマンドはMySQLコンテナから、データベースをダンプするサンプルです。

注釈

-Tを使うと、bashなどを介した対話的な操作はできなくなります。

作業ディレクトリを確認したい(pwd

$ docker compose exec コンテナ名 pwd

pwdコマンドで作業ディレクトリを確認できます。

作業ディレクトリは、 DockerfileのWORKDIRで変更したり、 compose.yamlworking_dir設定で変更できます。

services:
  app:
    image: python:3.12
    working_dir: /app

working_dirを設定すると、docker compose execでコマンドを実行する際、その設定されたディレクトリが作業ディレクトリとなります。

シェルを起動したい(bash

$ docker compose exec コンテナ名 bash
root@ランダム:/作業ディレクトリのパス#

bashコマンドでコンテナ内のシェルを起動できます。 リモートサーバーにログインしたときのように、対話的にコンテナ内を操作できます。

シェルを起動した後は、コンテナ内で自由にコマンドを実行できます。 シェルから抜ける(ホスト側に戻る)には、exitコマンドを実行してください。

リファレンス