Docker Swarm为何未重启异常退出的Python应用容器
Docker Swarm未自动重启故障容器的原因
核心原因1:Python代码强制返回0退出码,不符合on-failure重启触发条件
你的Python代码finally块中存在return 0语句,而Python语法规则中finally块的代码一定会在try/except逻辑执行完成后执行:
- 即便
except块捕获异常后执行了raise抛出异常,最终也会被finally的return 0覆盖,进程退出码始终为0 - Docker Swarm的
on-failure重启策略仅会在容器进程以非0退出码异常退出时触发重启,退出码为0属于正常退出,不会触发重启
核心原因2:Docker Compose重启策略配置语法错误
你给inserter13服务配置的restart_policy不符合Compose语法规范:
# 错误配置 deploy: restart_policy: on-failure # default is 'any'
正确的配置需要明确指定condition字段,你漏写该前缀会导致Swarm无法正确解析重启策略,配置未生效:
# 正确配置 deploy: restart_policy: condition: on-failure
修复方案
- 修改Python代码,移除
finally块中的return 0语句,异常场景下让进程自然返回非0退出码,正常执行完成可按需返回0 - 修正
inserter13服务的restart_policy配置,可根据业务需要补充重试次数、重启延迟参数,避免短时间频繁重启:
deploy: restart_policy: condition: on-failure max_attempts: 10 # 最大重试次数,按需调整 delay: 5s # 每次重启间隔,按需调整
- 验证修复效果:手动模拟程序异常,执行
echo $?确认进程退出码为非0,部署后触发异常验证Swarm自动重启逻辑是否正常生效
内容的提问来源于stack exchange,提问作者Sean McCarthy
相关产品推荐
相关产品推荐

