exec 的四个常用选项
docker exec 在运行中的容器里另起一个进程:-u 指定用户、-w 指定工作目录、-e 临时注入环境变量、-d 放到后台执行。这些参数只作用于本次命令,不会改动容器本身的配置,所以适合排查与临时操作。
基本信息
| 语法 | docker exec [-u USER] [-w DIR] [-e K=V] [-d] CONTAINER CMD |
|---|---|
| 作用范围 | 仅本次进程,容器配置不变 |
| 常用组合 | -it 进交互式 shell;-T 在无终端环境禁用 TTY |
| 前提 | 容器必须处于运行状态 |
| 注意 | -w 目录必须已存在,-e 不会持久化 |
典型使用场景
- 进容器排查:docker exec -it 容器 sh,先确认镜像里有没有 bash
- 以应用相同身份执行命令(-u www-data),验证失败是否由权限或身份引起
- 临时带一个变量跑脚本(-e API_URL=...),不必为此重建容器
- 在指定目录下执行命令(-w /var/www/html),省掉手动切换目录
- 后台触发一次长任务(-d),随后从日志或文件看结果
- CI 脚本里加 -T,避免因没有终端而报 the input device is not a TTY
示例
示例
docker exec -it web sh # 交互式进入容器
docker exec -u www-data -w /var/www/html web php -v # 指定用户与工作目录
docker exec -e API_URL=http://api:8080 web env | grep API_URL
docker exec -T db psql -U postgres -c 'select 1;' # 无终端环境下必须加 -T
docker exec -d web sh -c 'touch /tmp/deploy.flag' # 后台执行,输出被丢弃参数对照
| 参数 | 作用 | 常见问题 |
|---|---|---|
| -u USER | 以指定用户执行 | 账号不存在会报错,镜像里没有该用户时改用 UID |
| -w DIR | 指定工作目录 | 目录不存在直接失败,不会自动创建 |
| -e K=V | 注入本次环境变量 | 不持久化,容器重建后消失 |
| -d | 后台执行 | 输出被丢弃,要看结果得让命令重定向到文件 |
| -i 与 -t | 保持输入、分配终端 | 脚本里带 -t 会因无终端报错,改用 -T |
-d 后台执行时命令输出默认丢弃,想看结果要么不加 -d,要么让命令自己重定向到文件,之后用 docker exec 或 docker cp 取出来。
exec 起的是容器内的新进程,与主进程的环境和 PID 1 职责都不同,信号处理与子进程回收不归它管,长期服务不要靠 exec 拉起。