交互式运行是什么
交互式运行由两个选项组成:一个保持标准输入打开,另一个分配伪终端。两者组合后,容器内的命令行就像远程登录一样可以正常输入输出,常用于一次性调试、试跑镜像,以及在干净环境里验证命令。
基本信息
| 语法 | docker run -it [选项] IMAGE [COMMAND] |
|---|---|
| 含义拆解 | -i 保持标准输入打开;-t 分配伪终端 |
| 常用搭配 | --rm 退出即清理 -v 挂载当前目录 -w 设定工作目录 -u 指定用户 |
| 退出方式 | 输入退出命令或按组合键结束主进程,容器随之停止 |
| 适用前提 | 需要真实的终端会话,脚本与流水线里通常不满足 |
典型使用场景
- 试跑陌生镜像:拉下来先进去看目录结构与可用命令,再决定怎么用
- 临时验证命令:在干净环境里跑一次脚本,确认依赖与参数是否正确
- 挂载当前目录做实验:把工作目录挂进容器,就地编译或处理数据后直接看到结果
- 排查网络与解析:在容器内执行查询命令,验证服务发现与连接是否正常
- 生成密钥或证书:用官方工具镜像生成文件再复制出来,避免污染宿主机环境
常用示例
常用示例
docker run --rm -it alpine:3.20 sh # 最小交互环境
docker run --rm -it -v $PWD:/work -w /work node:20-alpine sh # 挂当前目录进去跑
docker run --rm -i ubuntu:24.04 cat /etc/os-release # 只要输入不要终端
docker run --rm -it --entrypoint sh nginx:1.27-alpine # 覆盖入口点进去看
exit # 会话内退出,容器随即停止两个选项分别管什么
| 选项 | 作用 | 单独使用时的问题 |
|---|---|---|
| -i | 保持标准输入打开 | 能看到输出但拿不到提示符,无法正常交互 |
| -t | 分配伪终端 | 终端行为不完整,回显与信号处理可能异常 |
| -it | 两者组合 | 日常交互的默认写法 |
| --rm | 退出后删除容器 | 现场与日志一并消失,排障时慎用 |
| -u | 指定用户运行 | 以默认用户进去,可能看到与应用不一致的权限结果 |
交互会话里的常用动作
- 看系统版本与包管理器类型,判断后续用哪套命令排查
- 查看目录结构与启动脚本,确认镜像的启动逻辑
- 验证环境变量是否按预期注入,确认配置来源
- 手工执行一次业务命令,比对与容器启动时的差异
- 确认网络与解析行为,验证依赖服务的连通性
用交互方式跑常驻服务很危险:会话一断开或按了中断组合键,主进程就会收到结束信号,容器随之停止。正式服务要用后台方式启动。
在脚本或流水线里不要分配伪终端,没有真实终端时会直接报错;这类场景只需要保持输入的那个选项,或者干脆不用交互选项。
调试完要把结论留下
- 把在容器里验证过的命令与结论记录到变更单,避免下次重新摸索
- 确认问题出在镜像层面时改构建描述,出在运行参数时改部署配置,不要停在临时容器里
- 临时容器用完就删,避免堆积大量停止的实例把磁盘和列表都拖乱
- 调试用的挂载权限尽量只读,防止误删宿主上的文件
- 涉及凭据的实验不要在交互历史里留下明文,结束后清理历史与临时文件
交互环境里的改动只在当前容器有效。确认某个依赖或配置能解决问题后,要及时写回构建描述或部署配置,否则容器一重建问题就会重现。