目录
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 镜像 启动一个新容器进行检查。
相关章节
- 查看日志和调试
- docker run 参数
- docker cp:在主机和容器之间复制文件
- 常见错误信息:
executable file not found、TTY 错误
动手练习
练习:用一条命令,以 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日