起動中のコンテナに入って操作するにはdocker execにシェルを指定して実行する。コンテナに入らず1つのコマンドだけ実行する使い方もある。

起動中のコンテナに入る

docker exec -it <コンテナ> bashを実行するとコンテナ内のシェルが起動し、そのまま操作できる。

$ docker exec -it demo-rocky bash
[root@ccc2fd94de44 /]#

-iは標準入力を開いたままにするオプション、-tは擬似端末を割り当てるオプションである。対話的に操作するには両方を指定する。省略するとキー入力を受け付けず、プロンプトも表示されない。

シェルを終了してホストに戻るにはexitを実行する。コンテナ自体は起動したまま残る。

[root@ccc2fd94de44 /]# exit
$

bashがないイメージの場合

軽量なイメージにはbashが含まれていない場合がある。Alpine Linuxのイメージでbashを指定すると次のエラーになる。

$ docker exec -it demo-alpine bash
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown

その場合はshを指定する。

$ docker exec -it demo-alpine sh
/ #

コンテナを指定する

<コンテナ>にはコンテナ名かコンテナIDを指定する。どちらもdocker psで調べられる。

$ docker ps
CONTAINER ID   IMAGE                     COMMAND       CREATED         STATUS         PORTS     NAMES
ccc2fd94de44   rockylinux/rockylinux:9   "sleep 300"   2 minutes ago   Up 2 minutes             demo-rocky

上記の例ではNAMES列のdemo-rockyがコンテナ名、CONTAINER ID列のccc2fd94de44がコンテナIDである。どちらを指定しても同じ結果になる。

$ docker exec demo-rocky pwd
/
$ docker exec ccc2fd94de44 pwd
/

コンテナに入らずコマンドだけ実行する

コマンドを1つ実行するだけなら-itは不要である。実行結果がホスト側に出力される。

$ docker exec demo-rocky ls /etc/os-release
/etc/os-release

docker execdocker container execの短縮形である。どちらを実行しても動作は同じである。

よく使うオプション

オプション内容
-i標準入力を開いたままにする
-t擬似端末を割り当てる
-u実行するユーザーを指定する
-w作業ディレクトリを指定する
-e環境変数を渡す

コンテナが一般ユーザーで動いている場合、-u 0または-u rootを指定するとroot権限で実行できる。パッケージのインストールなどに使う。

$ docker exec -u 0 demo-rocky whoami
root

-wで作業ディレクトリを指定すると、そのディレクトリでコマンドを実行する。

$ docker exec -w /tmp demo-rocky pwd
/tmp

-eで環境変数を渡す。

$ docker exec -e FOO=bar demo-rocky sh -c 'echo $FOO'
bar

Docker Composeの場合

Docker Composeで起動したコンテナにはdocker compose execで入る。コンテナ名ではなくcompose.ymlservicesに記述したサービス名を指定する。

services:
  rocky:
    image: rockylinux/rockylinux:9

上記の場合はrockyを指定する。

$ docker compose exec rocky bash
[root@cc8fb880710e /]#

docker compose execは既定で擬似端末を割り当てるため、-itを指定しなくても対話的に操作できる。割り当てを無効にするには-Tを指定する。

コマンドだけ実行する場合も同じ形式で指定する。

$ docker compose exec rocky pwd
/

停止中のコンテナには入れない

docker execは起動中のコンテナだけを対象とする。停止中のコンテナを指定すると次のエラーになる。

$ docker exec -it demo-alpine sh
Error response from daemon: container 32049fdea819... is not running

docker ps -aで停止中のコンテナも含めて状態を確認し、docker startで起動してから実行する。

$ docker start demo-alpine
$ docker exec -it demo-alpine sh
/ #