docker exec 是在运行中的容器内执行新命令的轻量级方式,支持交互式 Shell、非交互命令、指定用户和环境变量注入,适用于调试、运维和临时操作,但要求容器处于 Running 状态且注意 Shell 兼容性。

在 Docker 容器处于 Running 状态时,使用 docker exec 可以在容器内运行新命令,而无需进入交互式 Shell 或重启容器。这是日常运维、调试和临时操作最常用的方式之一。
基本语法与常用选项
docker exec 的核心作用是在已运行的容器中启动一个新进程。最简用法如下:
-
docker exec -it <容器名或ID> /bin/sh:以交互模式(-i保持 STDIN 打开,-t分配伪终端)进入容器 Shell -
docker exec <容器名或ID> ls /app:非交互式执行单条命令,输出直接返回到宿主机终端 -
docker exec -u root <容器名> whoami:以指定用户(如 root)身份执行命令,适用于权限受限的容器 -
docker exec -e ENV_VAR=value <容器名> printenv ENV_VAR:临时注入环境变量
常见实用场景
很多操作依赖 exec 快速响应,例如:
-
查看运行时状态:如
docker exec nginx ps aux | grep nginx检查 Nginx 进程是否正常 -
读取日志或配置文件:如
docker exec redis cat /usr/local/etc/redis.conf -
触发应用内部命令:如
docker exec myapp python manage.py migrate(Django 容器中执行数据库迁移) -
临时调试工具调用:若容器未预装
curl或netstat,可先apt update && apt install -y curl(需有 root 权限且基础镜像支持包管理)
注意事项与避坑点
看似简单,但几个细节容易导致失败:
- 容器必须是 Running 状态;
Exited状态下exec会报错 “No such container” - 镜像若基于
scratch或精简版(如alpine无/bin/bash),应改用/bin/sh;可用docker inspect <容器> | jq '.Config.Shell'查默认 Shell -
-it组合仅在需要交互时使用;后台批量执行脚本建议去掉-t,否则可能因 TTY 分配失败而卡住 - 执行耗时命令(如备份、导出)建议加
--detach(-d)异步运行,避免终端断连导致进程被中断
替代方案对比:exec vs attach vs run
docker exec 是“在已有容器里起新进程”,不同于:
-
docker attach:复用容器主进程的输入输出流,退出即断开,不推荐用于调试(可能误停主进程) -
docker run --rm -it --volumes-from:适合一次性任务(如数据修复),但需挂载相同卷并确保镜像兼容,开销比exec大










