docker容器执行

描述在正在运行的容器中执行命令
用法docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
别名
docker exec

Docker 调试简介

要轻松地将调试 shell 放入任何容器中,请使用docker debug. Docker Debug 是使用docker exec.有了它,您可以将 shell 放入任何容器或图像中,甚至是纤薄的容器或图像,而无需进行修改。另外,您可以在其可定制的工具箱中携带您最喜欢的调试工具。

立即探索 Docker 调试。

描述

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分配伪 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,并以shshell 作为其主进程。该-d选项( 的简写--detach)将容器设置为在后台以分离模式运行,并附加伪 TTY ( -t)。该-i选项设置为保持STDIN附加 ( -i),这会阻止sh进程立即退出。

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

$ docker exec -d mycontainer touch /tmp/execWorks

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

sh接下来,在容器上执行交互式shell。

$ docker exec -it mycontainer sh

这将在容器中启动一个新的 shell 会话mycontainer

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

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

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

以下示例在容器中创建一个新的 shell 会话mycontainer,并将环境变量$VAR_A设置为1和。这些环境变量仅对该命令启动的进程 有效,并且不可用于容器内运行的其他进程。$VAR_B2shdocker exec

$ 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