You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Elastic Beanstalk 偶发Bitbucket pipelines部署失败问题咨询

问题根本原因

你对问题的推测方向正确,报错核心是EB部署引擎执行FlipApplication步骤删除旧应用目录时,目录仍有进程在操作文件/生成新文件,导致删除失败,具体诱因分为三类:

  1. 应用进程未完全终止:部署阶段如果web服务进程、异步任务进程(队列消费、定时任务)没有被完全终止,仍有运行中的进程向旧的/var/app/current目录写入日志、临时文件、缓存文件,会导致删除时目录不为空。
  2. 动态内容存放在部署目录下:如果应用将运行时生成的用户上传资源、runtime缓存、业务日志等动态内容直接存储在/var/app/current目录下,而非独立的临时目录或持久化存储卷,这些动态生成的文件会被视作旧目录内容,有进程操作时就会阻碍删除。
  3. 权限异常残留:如果有进程以root权限在旧目录生成了部署引擎无权限删除的文件,也会触发同类报错,日志会优先展示目录非空的提示。
可落地修复方案
  • 新增部署前置终止钩子,在切换目录前强制终止所有关联应用进程,在项目的.ebextensions目录下新增如下配置文件:
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/00_kill_old_processes.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      # 终止所有运行在旧应用目录下的进程,忽略无进程匹配的报错
      pkill -f /var/app/current || true
      # 等待进程资源完全释放
      sleep 3
  • 调整动态内容存储路径:将应用的用户上传文件、运行时缓存、日志等动态内容的存储路径修改为/tmp、/var/log或者独立挂载的EFS持久化卷,禁止在/var/app/current目录下生成动态内容。
  • 新增强制清理兜底钩子:如果偶发概率极低,可以新增部署兜底清理脚本,避免删除失败导致部署崩溃:
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/enact/99_force_clean_old_dir.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      # 强制清理旧应用目录
      rm -rf $(readlink /var/app/current) 2>/dev/null || true
  • 切换不可变部署模式:生产环境可以将EB的部署策略从滚动部署切换为不可变部署,每次部署直接启动新EC2实例替换旧实例,从根源上避免旧目录删除失败的问题。

内容的提问来源于stack exchange,提问作者Ricardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:27:01