首页/云/Docker 容器速查/docker compose exec 进入服务容器
Compose 编排55 条

docker compose exec 进入服务容器

在运行中的服务容器里执行命令:进 shell、跑调试脚本、查看文件;默认分配 TTY,可指定用户与工作目录。

Docker 容器速查云更新于 2026-10-13

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 的定位参数是服务名而不是容器名,服务名写错时报的是找不到服务,与容器是否存在的问题区分开更容易定位。

易错点

  • 以为 exec 进入的是最新副本:默认进序号 1 的容器,要看其他副本得先用 ps -q 取容器 ID
  • 在 exec 里手工改文件做临时修补,容器重建后改动全部丢失,长期修复要落到镜像或挂载配置上
  • 把 exec 当成启动方式:容器没起来时它不可用,服务启动必须靠 compose up
  • 在 CI 里使用交互式 exec 命令(带 -it),无终端环境下必然失败
  • 对数据库这类服务执行交互式命令时忘记加 -T,脚本卡在等待输入上直到超时,排查时容易被当成服务无响应

数据来源与参考

  • Docker 官方 CLI 参考:docker compose exec(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌