Github Actions通过SSH部署Docker镜像后任务挂起如何解决
问题原因
你当前的脚本虽然加了&将命令放到后台运行,但后台进程的标准输出(stdout)、标准错误(stderr)仍然绑定在当前SSH会话上,appleboy/ssh-action会等待所有关联的输出流完全关闭后才会结束任务,因此会一直处于挂起状态。此外你没有给docker run命令加后台运行参数,容器默认会以前台模式运行,也是导致挂起的核心原因之一。
修复方案
推荐优先使用Docker原生的detached模式运行容器,无需依赖shell的后台机制:
- 修改最后一行
docker run命令,添加-d参数,启动后直接返回容器ID,自动脱离当前会话,同时补充--name参数保证后续可以正常停止对应容器:
script: | # 优化:强制删除容器,即使容器不存在也不会报错中断流程 docker rm -f ss-timmy || true docker pull spaceturtle0/ss-timmy:latest # -d 参数表示后台运行容器,日志可通过docker logs命令后续查看 docker run -d --name ss-timmy --env-file=Timmy-SchoolSimplified/.env spaceturtle0/ss-timmy
如果有特殊场景必须以前台模式运行容器,可以用以下方式彻底切断进程与会话的关联:
- 将输出全部重定向到空设备,搭配
nohup让进程忽略SSH挂起信号:
nohup docker run --name ss-timmy --env-file=Timmy-SchoolSimplified/.env spaceturtle0/ss-timmy > /dev/null 2>&1 &
内容的提问来源于stack exchange,提问作者Saphire
相关产品推荐
相关产品推荐

