本記事はDocker ver24.0.7の環境で確認しています。
このコマンドは、実行中のコンテナ環境内で、指定したコマンドを実行します。
よく利用するのは、仮想環境内でオペレーションを行いたい場合に、コンテナ内でシェルを起動するときです。
また、コンテナ内で何らかのコマンドを1つ実行して、その結果がすぐ知りたい場合などにも使います。
例えば、コンテナ内のファイル存在確認を行う際に、「ls」コマンドを実行するときなどが挙げられます。
尚、このコマンドは、起動状態のコンテナに対してのみ実行可能です。
docker execコマンドのフォーマットとオプション
フォーマット
docker exec [オプション] [コンテナ] [コマンド] [引数...]
主なオプション一覧
オプション | 概説 |
---|---|
-d, --detach | 指定したコマンドをコンテナ内でバックグラ ウンドで実行します。 |
-e, --env <定義> | 指定したコマンドを実行する際に環境変数を 適用します。 |
-i, --interactive | 指定したコマンドを実行する際、コンテナの 標準入力をDockerホストの標準入力と接続し ます。 |
-t, --tty | コンテナ内で疑似的な仮想端末を割り当てて、 Dockerホストの標準出力と接続します。 |
--privileged | 指定したコマンドを特権モードで実行します。 |
-u, --user | 指定したコマンドを特定ユーザで実行します。 |
-w, --workdir | コンテナ内でコマンドを実行する際の作業ディ レクトリが指定できます。 |
コマンド例
$ docker exec testvm ls -l /usr
$ docker exec -it testvm bash
$ docker exec -u nobody testvm ps -ef
docker execコマンドの使い方
以下で実例をまじえたコマンドの使い方を解説していきたいと思います。
基本事項の解説
docker execコマンドは、指定したコマンドやスクリプトなどを指定したコンテナ内部で起動することができます。
ちょっとしたコマンドの実行結果を確認するときなどにも便利です。
単発のコマンドの場合は良いのですが、bashなどのシェルの場合はdocker execコマンドのオプションを付ける必要があります。
Dockerホストとコンテナ内のシェルを接続したままにする「-i」とコンテナ内のシェルが使用するttyを割り当てるための「-t」が必要です。
他にも、指定したコマンドを実行するユーザ権限の指定やワークディレクトリの指定、環境変数の追加など、便利なオプションが揃っています。
コンテナ内で「ls」コマンドを実行する
docker execコマンドで指定したコマンドを、指定したコンテナ内で実行することができます。
コンテナ内で「ls」コマンドを実行し、その結果を確認してみましょう。
$ docker exec testvm ls -l /usr
以下のように、コンテナ内の/usrディレクトリ下のファイルの一覧が出力されました。
total 52
drwxr-xr-x 2 root root 12288 Apr 23 11:09 bin
drwxr-xr-x 2 root root 4096 Apr 15 11:09 games
drwxr-xr-x 2 root root 4096 Apr 15 11:09 include
drwxr-xr-x 14 root root 4096 Apr 23 11:06 lib
drwxr-xr-x 2 root root 4096 Apr 23 11:06 lib32
drwxr-xr-x 2 root root 4096 Apr 23 11:07 lib64
drwxr-xr-x 2 root root 4096 Apr 23 11:06 libx32
drwxr-xr-x 10 root root 4096 Apr 23 11:06 local
drwxr-xr-x 1 root root 4096 Jun 1 01:41 sbin
drwxr-xr-x 33 root root 4096 Apr 23 11:06 share
drwxr-xr-x 2 root root 4096 Apr 15 11:09 src
コンテナ内でbashを起動して仮想環境内でオペレーションを行う
コンテナ内でbashなどのシェルを起動することで、コンテナにログインしたかのようにオペレーションを行うことが出来ます。
$ docker exec -it testvm bash
※「-it」は「-i -t」と同じです。
以下のようにプロンプトが変わったと思います。
[root@b8494b835220 /]#
「root@」のあとの文字列は、docker execコマンドで指定したコンテナのコンテナIDです。このプロンプトは、docker exec で実行したコンテナ内のbashが出力しているプロンプトになります。よって、このプロンプトで実行するコマンドは、コンテナ内で実行することになります。
試しに、色々なコマンドを実行してみてください。
[root@0d77dbbbb3e1 /]# hostname
0d77dbbbb3e1
[root@0d77dbbbb3e1 /]# uname -a
Linux 4d5ea173ad3c 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
[root@0d77dbbbb3e1 /]# pwd
/
[root@0d77dbbbb3e1 /]#
「exit」を実行することで、コンテナ内のシェルが終了し、Dockerホストに戻ります。
[root@b8494b835220 /]# exit
exit
$
コンテナ内で起動するコマンドの実行時のユーザを指定する
「-u」オプションを使用することで、コンテナ内で起動するコマンドの実行時のユーザを指定することができます。
例えば、コンテナ内で「ps」コマンドを「nobody」ユーザで実行する場合は、以下を実行します。
$ docker exec -u nobody testvm ps -ef
以下のように「ps」コマンドの出力結果が表示されたかと思います。「ps -ef」のUIDは「nobody」になっているのが確認できます。
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:41 pts/0 00:00:00 /sbin/docker-init -- /bin/bash
root 6 1 0 01:41 pts/0 00:00:00 /bin/bash
nobody 351 0 0 04:39 ? 00:00:00 ps -ef
コマンドを実行する際に指定した環境変数を適用する
「-e」オプションで指定した環境変数を、指定したコマンドを実行する際に適用することができます。
コンテナtestvm内でbashを起動しまして、「testenv=123」という環境変数をコンテナ内で起動するbashに適用してみます。
$ docker exec -it -e testenv=123 testvm bash
表示されたコンテナ内のbashのプロンプトで「env」コマンドを実行し、実行したbashに適用されている環境変数を確認してみましょう。
[root@356027bd1667 /]# env
HOSTNAME=356027bd1667
TERM=xterm
testenv=123
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
(以下省略)
色々な環境変数が表示されますが、その中にdocker execコマンドのオプションで指定した「testenv=123」の値が存在することが確認できました。
1つのdocker execコマンドで複数の環境変数を適用する場合は、「-e」オプションを複数記述します。試しに、「testenv2=abc」と「testenv3=321」を指定してdocker execコマンドを実行します。
$ docker exec -it -e testenv2=abc -e testenv3=321 testvm bash
コンテナ内のbashのプロンプトでenvコマンドを実行します。
[root@356027bd1667 /]# env
HOSTNAME=356027bd1667
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
testenv3=321
testenv2=abc
(以下省略)
指定した2つの環境変数が確認できました。
コマンド実行時のカレントディレクトリ(作業ディレクトリ)の指定
docker execコマンドを使用してコンテナ内でシェルを起動した場合、デフォルトではカレントディレクトは/(ルート)になっています。
またコンテナ内でlsコマンドを実行した場合も、カレントディレクトリはデフォルトでは/(ルート)です。
「-w」オプションでディレクトリを指定することで、そのディレクトリをカレントディレクトリ(作業ディレクトリ)として利用することができます。
オプション「-w /tmp」を指定してdocker execコマンドを実行します。
$ docker exec -it -w /tmp testvm bash
プロンプトで「pwd」コマンドを実行して、カレントディレクトリを確認します。
[root@22755b68256f tmp]# pwd
/tmp
「/tmp」ディレクトリがカレントディレクトリになっていることが確認できました。
一旦exitコマンドでDockerホストに戻ってからオプション「-w /usr/bin」を指定して、以下のdocker execコマンドを実行してみてください。
$ docker exec -it -w /usr/bin testvm pwd
/usr/bin
「pwd」コマンドが実行されたときのカレントディレクトリは/usr/binになっています。
おわりに
以上でdocker execコマンドの紹介を終わります。
ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。
他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerコマンドの一覧(オリジナルな実例付き)」をご参照ください。
ご訪問ありがとうございました!
コメント