compose exec 是什么
docker compose exec 在运行中的服务容器里执行命令:进 shell、跑调试脚本、查看文件。它按服务名定位,不必先查容器名,默认分配终端并可指定用户、环境变量与工作目录;服务有多副本时默认进入序号为 1 的容器。
基本信息
| 用途 | 在运行中的服务容器内执行命令 |
|---|---|
| 语法 | docker compose exec [选项] 服务 命令 |
| 常用选项 | -u 指定用户、-e 注入变量、-w 工作目录、-T 禁用 TTY |
| 默认行为 | 分配终端,进入序号 1 的副本 |
| 前提 | 服务必须处于运行状态 |
典型使用场景
- 按服务名直接进容器排查,省掉先查容器名这一步
- 以应用用户身份执行命令,验证权限问题是否由身份引起
- 在容器内连数据库或调接口,验证网络与凭据配置
- CI 脚本里加 -T 执行命令,避免因无终端而报错
- 对指定服务执行一次性检查命令,如查看进程与监听端口
- 多副本时先 docker compose ps -q 取容器 ID,再用 docker exec 精确定位
示例
示例
docker compose exec web sh # 进入 web 服务容器
docker compose exec -u root web id # 以指定用户执行
docker compose exec -T db psql -U postgres -c 'select 1;' # 无终端环境必须加 -T
docker compose exec -w /app/api web ls -l # 指定工作目录
docker compose ps -q web | head -n1 | xargs -r docker exec -it # 指定副本exec 与 run 的区别
| 命令 | 作用对象 | 是否新建容器 |
|---|---|---|
| compose exec | 运行中的服务容器 | 否,复用现有容器 |
| compose run | 按服务定义新起容器 | 是,创建一次性容器 |
| compose run --rm | 新容器执行后删除 | 是,适合一次性任务 |
| docker exec | 指定容器 | 否,需要容器 ID 或名称 |
CI 脚本里忘记加 -T 会报 the input device is not a TTY,这条错误与容器本身无关,补上参数即可。
服务没运行起来时 exec 直接失败,先看 compose ps -a 与日志把服务拉起来,再进容器排查。
exec 起的进程与容器主进程并不共享全部环境,默认不继承镜像的入口脚本设置,需要时用 -e 或 -w 显式传入。
exec 的定位参数是服务名而不是容器名,服务名写错时报的是找不到服务,与容器是否存在的问题区分开更容易定位。