为何docker-compose up直接退出,docker-compose run可进入bash?
Docker Compose up 容器立即退出但 run 能进入bash的原因及解决
核心原因很简单:docker-compose up默认不给容器分配终端(tty),也不保持标准输入打开,当你执行/opt/bb/bin/bash时,bash在非交互、无输入的环境下会直接退出(返回码0是正常退出的标志);而docker-compose run默认会自动添加-i(保持标准输入打开)和-t(分配tty)参数,让bash进入交互模式,所以能维持会话。
两者的关键差异
docker-compose up:以服务模式启动容器,默认不配置tty和stdin,bash作为非交互进程,没有输入就会立即结束docker-compose run:以一次性任务模式启动容器,默认开启交互终端支持,bash会等待用户输入,保持运行状态
解决办法
如果想让docker-compose up启动后容器保持运行并支持交互,只需在docker-compose.yaml的service配置里添加tty: true和stdin_open: true:
version: "3.7" services: svc: build: context: . dockerfile: Dockerfile volumes: - .:/workarea/svc command: ["/opt/bb/bin/bash"] tty: true stdin_open: true
修改后执行docker-compose up,容器会保持前台运行,你可以直接在当前终端进行交互;如果想后台运行,加上-d参数,之后用docker-compose exec svc /opt/bb/bin/bash进入容器会话。
如果不需要交互,只是想让容器保持运行,可以把command替换为持续运行的命令,比如tail -f /dev/null,这样容器会一直处于运行状态。
内容的提问来源于stack exchange,提问作者African_king
相关产品推荐
相关产品推荐

