如何在已经运行的 Docker 容器里执行命令?

docker exec 容器名 命令 在运行中的容器内执行命令;加 -it 开交互终端,-u root 指定身份,-e 传环境变量。批量场景用 sh -c 串多条。本文给出完整用法。

最佳实践
如何在已经运行的 Docker 容器里执行命令?封面

核心命令:docker exec <容器名> <命令>——在运行中的容器内执行任意命令而不影响主进程。交互式操作加 -it,权限不足加 -u root,多命令用 sh -c "cmd1 && cmd2" 串联。

常用形式

# 单条命令(非交互)
docker exec myapp ls -l /app/logs

# 交互 shell
docker exec -it myapp bash

# 以 root 身份(容器默认用户权限不够时)
docker exec -u root -it myapp sh

# 注入环境变量执行
docker exec -e DEBUG=true myapp python manage.py check

# 多条命令串联
docker exec myapp sh -c "cd /app && python manage.py migrate"

实际场景示例

# 看容器内监听端口
docker exec myapp ss -ltn

# 触发应用健康检查
docker exec myapp curl -sf localhost:8080/health

# Django 进 shell
docker exec -it web python manage.py shell

# 看配置文件当前内容
docker exec myapp cat /etc/nginx/nginx.conf

脚本化使用要点

  1. 非交互环境去掉 -it:cron/CI 里带 -t 会报 "the input device is not a TTY"
  2. 退出码透传:容器内命令的退出码就是 docker exec 的退出码,脚本里可直接判断成败
  3. 幂等性:脚本里反复执行的命令要幂等(如 mkdir -p

与 docker run 的区别

run新建容器执行命令;exec 是在已运行的容器里加跑一个进程。排查线上容器用 exec;跑一次性任务想环境干净用 run --rm。

观测云对照

exec 会话也有审计价值。 生产容器里执行了什么命令,属于运维审计范畴;配合观测云对主机与容器的日志采集,关键操作可追溯。当然,更多排查直接在平台上看日志指标完成,无需 exec。

常见问题(FAQ)

Q:报 "container is not running"?
A:exec 只对工作状态的容器有效,docker start 先拉起来;查退出原因用 docker logs 容器名 --tail 50

Q:命令找不到(command not found)?
A:精简镜像里没装该工具,现装或换镜像自带工具排查。

Q:能在停止的容器上 exec 吗?
A:不能。停止的容器用 docker cp 拷文件或 commit 后 run。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台