起動中のコンテナに入って操作するには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 execはdocker 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.ymlのservicesに記述したサービス名を指定する。
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
/ #
