docker container exec

说明在运行中的容器内执行命令
用法docker container exec [选项] 容器 命令 [参数...]
别名
docker exec

介绍 Docker Debug

要轻松获取进入任何容器的调试 Shell,请使用 docker debug。Docker Debug 是使用 docker exec 进行调试的替代方案。有了它,您可以进入任何容器或镜像的 Shell,即使是精简版,也无需修改。此外,您还可以将其可定制的工具箱中带上您喜欢的调试工具。

立即探索 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, --envAPI 1.25+ 设置环境变量
--env-fileAPI 1.25+ 读取包含环境变量的文件
-i, --interactive即使未附加,也保持 STDIN 开启
--privileged赋予命令扩展权限
-t, --tty分配一个伪终端 (pseudo-TTY)
-u, --user用户名或 UID (格式:<name|uid>[:<group|gid>])
-w, --workdirAPI 1.35+ 容器内的工作目录

示例

在运行中的容器上运行 docker exec

首先,启动一个容器。

$ docker run --name mycontainer -d -i -t alpine /bin/sh

这会创建一个名为 mycontainer 的容器,使用 alpine 镜像,以 sh Shell 作为其主进程,并启动该容器。-d 选项(--detach 的简写)设置容器在后台运行,处于分离模式,并附加一个伪终端 (-t)。设置 -i 选项以保持 STDIN 附加 (-i),这可以防止 sh 进程立即退出。

接下来,在容器上执行一个命令。

$ docker exec -d mycontainer touch /tmp/execWorks

这会在运行中的容器 mycontainer 内创建一个新文件 /tmp/execWorks,并在后台运行。

接下来,在容器上执行一个交互式 sh Shell。

$ docker exec -it mycontainer sh

这会在容器 mycontainer 中启动一个新的 Shell 会话。

为 exec 进程设置环境变量 (--env, -e)

接下来,在当前的 bash 会话中设置环境变量。

docker exec 命令继承容器创建时设置的环境变量。使用 --env (或其简写 -e) 可以覆盖全局环境变量,或为由 docker exec 启动的进程设置额外的环境变量。

以下示例在容器 mycontainer 中创建一个新的 Shell 会话,并将环境变量 $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