目录

Docker exec 教程:在运行中的容器内执行命令

docker exec 用于在一个正在运行的容器中执行命令,最常见的用途是进入容器排查问题。完整的调试流程请参阅查看日志和调试。

语法

docker exec [参数] 容器 命令 [参数...]
docker exec -it web sh        # 进入容器的 shell
docker exec web nginx -t      # 执行一条命令并获取结果

参数

docker exec 的参数不多,下面是 docker exec --help 列出的全部参数:

参数说明
-i, --interactive保持标准输入开启,以便输入内容
-t, --tty分配一个终端。交互操作时与 -i 一起使用:-it
-u, --user 用户[:组]以指定用户(名称或 UID)运行
-w, --workdir 路径在容器内的指定目录中运行
-e, --env 名称=值为本次运行设置环境变量
--env-file 文件从文件中读取环境变量
-d, --detach在后台运行,命令立即返回
--privileged为这条命令授予额外权限(用于调试,平时不要使用)
--detach-keys修改退出快捷键(默认为 Ctrl+P、Ctrl+Q)

以下示例都针对名为 web 的 nginx 容器。该容器启动时设置了环境变量 APP_MODE=demo:

docker run -d --name web -e APP_MODE=demo nginx:1.30-alpine

执行一条命令

$ docker exec web nginx -v
nginx version: nginx/1.30.5

$ docker exec web sh -c "ls /etc/nginx/conf.d && echo \$APP_MODE"
default.conf
demo
  • 第一条命令在容器中运行 nginx -v,结果会直接打印出来。
  • 要使用 &&、管道或变量时,请用 sh -c "..." 交给容器内的 Shell 处理。\$APP_MODE 中的 \ 可避免主机 Shell 提前替换变量;demo 是容器内的值。

交互式进入容器

docker exec -it web sh

进入后,提示符会变成 / #。你可以像在普通 Linux 中一样操作,输入 exit 退出,容器不会停止。如果镜像中有 bash,也可以使用 bash。

-u、-w、-e

$ docker exec -u nginx web id
uid=101(nginx) gid=101(nginx) groups=101(nginx)

$ docker exec -w /usr/share/nginx/html web ls
50x.html
index.html

$ docker exec -e GREETING=hi web sh -c "echo \$GREETING"
hi
  • -u nginx:以 nginx 用户运行(容器默认使用 root)。排查文件权限问题时很有用。
  • -w /usr/share/nginx/html:在指定目录中运行,相当于先执行 cd。
  • -e GREETING=hi:仅为本次运行设置环境变量,不会更改容器本身。

-d:在后台运行

$ docker exec -d web sh -c "sleep 2; touch /tmp/done"

$ docker exec web ls /tmp
done

-d 会让命令在后台运行并立即返回。2 秒后检查,可以看到 /tmp/done 已创建。适合启动无需等待结果的任务。

容器未运行

$ docker stop web
web

$ docker exec web ls
Error response from daemon: container 1ec4fdc5c592b09b64e8f28869c37f89ab17163f88bfcb09e82815a44b0e1164 is not running

docker exec 只能用于正在运行的容器。容器已停止时,先运行 docker start;如果容器启动后立即退出,exec 也无法进入。此时应查看 docker logs,或使用 docker run --rm -it --entrypoint sh 镜像 启动一个新容器进行检查。

相关章节

动手练习

练习:用一条命令,以 nginx 用户身份列出 web 容器 /etc/nginx 目录中的文件。

答案
docker exec -u nginx -w /etc/nginx web ls

常见问题

docker exec 和 docker run 有什么区别?

docker run 使用镜像**创建一个新容器**;docker exec 则在**已经运行的容器**中再执行一个进程。exec 结束不会影响容器本身。

docker exec -it 容器 bash 提示 executable file not found?

容器中没有 bash,例如基于 Alpine 的镜像只有 sh。改用 docker exec -it 容器 sh。

在容器中修改的文件,重建容器后还在吗?

不在。使用 exec 修改的是容器的可写层,删除容器后就会消失。需要保留的更改应写入 Dockerfile,或放在 Volume 中。

更新于 2026年10月14日