如何让交互式Docker Swarm服务持续运行,停止后可自动重启?
问题根因
你当前的服务自动退出是两个原因共同导致的:
- 入口进程
/bin/bash没有前台持久运行的任务,在无交互输入的场景下会主动正常退出,退出码为0 - 未配置Swarm服务的重启策略,默认策略仅在进程异常退出时才会重启,正常退出的服务不会被重新拉起
修复配置方案
按以下步骤修改你的docker-compose.yml即可:
- 首先在
deploy配置块下新增重启策略,指定无论进程是正常退出还是异常退出都执行重启 - 可选:将入口进程替换为更稳定的前台阻塞命令,避免bash无输入退出的问题,如果你确实需要保留bash环境后续交互可以保留原entrypoint,仅加重启策略也能实现退出后自动拉起
- 建议添加资源限制,避免服务异常占用过多集群资源
修改后的完整配置示例
version: '3.8' services: tools: image: myservice:${VERSION}.${BUILD_NUM} # 如果你需要保留bash交互环境可以保留下面这行,否则建议替换为entrypoint: ["tail", "-f", "/dev/null"] 更稳定 entrypoint: ["/bin/bash"] stdin_open: true tty: true deploy: mode: global # 新增重启策略配置 restart_policy: condition: any delay: 5s max_attempts: 3 window: 120s
配置说明
condition: any:表示无论进程退出原因是正常退出、异常退出还是超时,都会触发重启delay: 5s:两次重启之间的间隔时间max_attempts: 3:最多尝试重启3次,超过次数后会标记服务为失败状态,你可以根据需要调整为更大的数值window: 120s:判断重启是否成功的时间窗口,120秒内服务没有退出就算重启成功
内容的提问来源于stack exchange,提问作者Joe Phillips
相关产品推荐
相关产品推荐

