非交互式创建Ubuntu Docker容器后无法交互式启动的原因
问题描述
我基于最新Ubuntu镜像制作了自定义Docker镜像,目标是先以非交互模式创建容器,之后再以交互模式启动它。但遇到问题:通过非交互模式创建的容器,后续尝试以交互模式启动时,容器会启动后立即停止,无法进入CLI。
操作命令示例
PS ...\linux_project> docker images REPOSITORY TAG IMAGE ID CREATED SIZE hubusername/ubuntu latest b9db0844ba2c 26 hours ago 77.8MB PS ...\linux_project> docker run -it --name ubuntu_si hubusername/ubuntu root@f8a5cfe9a8e2:/# exit exit PS ...\linux_project> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8a5cfe9a8e2 hubusername/ubuntu "bash" 8 seconds ago Exited (0) 5 seconds ago ubuntu_si PS ...\linux_project> docker start -i f8a root@f8a5cfe9a8e2:/# exit exit PS ...\linux_project> echo yay! yay! PS ...\linux_project> docker run --name ubuntu_sni hubusername/ubuntu PS ...\linux_project> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 74bcc8ddd336 hubusername/ubuntu "bash" 6 seconds ago Exited (0) 6 seconds ago ubuntu_sni f8a5cfe9a8e2 hubusername/ubuntu "bash" About a minute ago Exited (0) 49 seconds ago ubuntu_si PS ...\linux_project> docker start -i 74b PS ...\linux_project> echo I would expect it to launch in interactive mode here
说明
- ubuntu_si:初始以交互模式启动的Ubuntu容器
- ubuntu_sni:初始未以交互模式启动的Ubuntu容器
原因分析
核心原因是容器创建时的终端配置会被持久化,后续启动无法补全缺失的关键参数:
交互模式创建的容器(ubuntu_si)
执行docker run -it时,-i(保持标准输入打开)和-t(分配伪终端)的参数会被写入容器的永久配置。后续用docker start -i启动时,bash进程能找到之前分配的伪终端,且标准输入处于打开状态,因此可以正常进入交互式CLI。非交互模式创建的容器(ubuntu_sni)
执行docker run时未添加-t参数,容器创建阶段并未分配伪终端,且默认关闭了标准输入。即便后续用docker start -i打开了标准输入,bash作为交互式shell,没有伪终端就无法维持交互环境,启动后会立刻退出。
简言之,-t参数的作用是给容器分配伪终端,这个配置在容器创建时就已确定,后续启动无法修改。如果创建时没加-t,bash没有终端绑定,自然无法保持运行状态。
内容的提问来源于stack exchange,提问作者David La Grange
相关产品推荐
相关产品推荐

