docker container exec
| 内容説明 | 実行中コンテナーにおいてコマンドを実行します。 |
|---|---|
| 利用方法 | docker container exec [OPTIONS] CONTAINER COMMAND [ARG...] |
| エイリアス | docker exec |
Docker Debug 導入
コンテナー内においてデバッグ用のシェルを利用したい場合は
docker debugを試してみてください。 Docker Debug はdocker execにおけるデバッグ機能の代わりとなるものです。 これを使えばどのようなコンテナー、どのようなイメージに対しても、それがどれだけスリムなものであっても、変更を加えることなくシェルを利用できます。 さらにカスタマイズ可能なこの環境内に、好みのデバッグツールを導入することもできます。今すぐ Docker Debug を確認してください。
内容説明
docker exec コマンドは、実行中のコンテナー内において新たなコマンドを実行します。
docker exec において指定したコマンドは、コンテナー内にプライマリープロセス (PID 1) が稼働中である場合にのみ実行されます。
そしてコンテナーが再起動した際には再実行されません。
コマンドは、コンテナーのデフォルトワーキングディレクトリにおいて実行されます。
コマンドは実行可能でなければなりません。 複数コマンドが連結したものやクォートで囲まれたコマンドでは動作しません。
- 以下は動作します:
docker exec -it my_container sh -c "echo a && echo b" - 以下は動作しません:
docker exec -it my_container "echo a && echo b"
オプション
| オプション | デフォルト | 内容説明 |
|---|---|---|
-d, --detach | デタッチモード。コマンドをバックグラウンドで実行します。 | |
--detach-keys | コンテナーデタッチ時のキーシーケンスを上書きします。 | |
-e, --env | API 1.25 以上 環境変数を設定します。 | |
--env-file | API 1.25 以上 環境変数ファイルを読み込みます。 | |
-i, --interactive | アタッチされていなくても STDIN は開放し続けます。 | |
--privileged | コマンドに拡張権限を付与します。 | |
-t, --tty | 擬似 TTY を割り当てます。 | |
-u, --user | ユーザー名または UID。(記述書式: <name|uid>[:<group|gid>]) | |
-w, --workdir | API 1.35 以上 コンテナー内部のワーキングディレクトリ。 |
利用例
実行中コンテナーでの docker exec 実行
まずはコンテナーを起動します。
$ docker run --name mycontainer -d -i -t alpine /bin/sh
上のコマンドは alpine イメージから mycontainer という名前のコンテナーを生成し起動します。
メインのプロセスとしてシェル sh を用います。
-d オプション (--detach の短縮形) はコンテナーをデタッチモード、つまりバックグラウンドで実行します。
また 疑似 TTY をアタッチします (-t)。
-i オプションは STDIN のアタッチを継続するものです。
これによって sh プロセスが即座に終了しないようにします。
次にコンテナー内にてコマンドを実行します。
$ docker exec -d mycontainer touch /tmp/execWorks
上のコマンドにより、バックグラウンドで実行中のコンテナー mycontainer 内に /tmp/execWorks というファイルを新規生成します。
次に対話シェル sh をコンテナー上にて実行します。
$ docker exec -it mycontainer sh
コンテナー mycontainer 内に新たなシェルセッションが起動します。
exec プロセスでの環境変数設定 (--env, -e)
次は現在の bash セッション内において環境変数を設定します。
docker exec コマンドは、コンテナーが生成された段階で設定される環境変数を受け継ぎます。
--env (短縮形 -e) を使うとグローバルな環境変数を上書きします。
あるいは docker exec によって起動したプロセスに対しては追加的に環境変数を設定できます。
以下の例ではコンテナー mycontainer 内に新たなシェルセッションを生成し、環境変数 $VAR_A に 1、$VAR_B 2 を設定します。
この環境変数の値は docker exec コマンドを起動した sh プロセスにおいてのみ有効です。
つまりコンテナー内で稼働する別プロセスではアクセスすることはできません。
$ docker exec -e VAR_A=1 -e VAR_B=2 mycontainer env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f64a4851eb71
VAR_A=1
VAR_B=2
HOME=/root
コンテナー権限の昇格 (--privileged)
docker run --privileged を参照してください。
exec プロセスに対するワーキングディレクトリ設定 (--workdir, -w)
docker exec コマンドは、デフォルトでコンテナーが生成されたときと同じワークディレクトリにおいて実行されます。
$ docker exec -it mycontainer pwd
/
ワーキングディレクトリを別の場所に指定したい場合は、このコマンドの実行時に --workdir オプション (短縮形 -w) を用います。
$ docker exec -it -w /root mycontainer pwd
/root
停止コンテナーに対する docker exec 実行
コンテナーが一時停止している場合、docker exec はエラー終了します。
$ docker pause mycontainer
mycontainer
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
482efdf39fac alpine "/bin/sh" 17 seconds ago Up 16 seconds (Paused) mycontainer
$ docker exec mycontainer sh
Error response from daemon: Container mycontainer is paused, unpause the container before exec
$ echo $?
1