如何在已经运行的 Docker 容器里执行命令?
docker exec 容器名 命令 在运行中的容器内执行命令;加 -it 开交互终端,-u root 指定身份,-e 传环境变量。批量场景用 sh -c 串多条。本文给出完整用法。
核心命令: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
脚本化使用要点
- 非交互环境去掉 -it:cron/CI 里带
-t会报 "the input device is not a TTY" - 退出码透传:容器内命令的退出码就是 docker exec 的退出码,脚本里可直接判断成败
- 幂等性:脚本里反复执行的命令要幂等(如
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。