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

Spring Boot+PostgreSQL多容器部署AWS Elastic Beanstalk遇阻求助

多容器Spring Boot+PostgreSQL应用部署AWS Elastic Beanstalk失败排查

本地部署流程(已验证正常)

1. 构建后端镜像

使用以下Dockerfile构建镜像并推送到Docker Hub:

FROM amazoncorretto:17
ARG JAR=target/peaksoft-lms-backend-0.0.1-SNAPSHOT.jar
COPY ${JAR} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
EXPOSE 8000

2. 本地docker-compose测试

编写docker-compose.yml文件:

version: '3.8'
services:
  backend:
    image: 'beksultancs/peaksoftlms:1.0.1'
    ports:
      - 80:8000
    depends_on:
      - postgres
    environment:
      - SPRING_PROFILES_ACTIVE=dev
      - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/peaksoftdb
      - SPRING_DATASOURCE_USERNAME=user
      - SPRING_DATASOURCE_PASSWORD=pass
      - SPRING_JPA_HIBERNATE_DDL-AUTO=create
    restart: "always"
  postgres:
    image: 'postgres:13-alpine'
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=peaksoftdb

执行docker-compose up --build,应用运行完全正常。

AWS Elastic Beanstalk部署尝试(均失败)

  • 尝试1:选择平台Docker running on 64bit Amazon Linux 2/3.4.17,上传docker-compose.yml文件,部署失败。
  • 尝试2:编写Dockerrun.aws.json(版本2),选择平台ECS running on 64bit Amazon Linux 2/3.1.3,上传该JSON文件,部署失败。
    JSON文件内容:
{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "backend",
      "image": "beksultancs/peaksoftlms:1.0.1",
      "essentials": true,
      "memory": 1024,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 8000
        }
      ],
      "links": [
        "postgres"
      ],
      "environment": [
        {
          "name": "SPRING_PROFILES_ACTIVE",
          "value": "dev"
        },
        {
          "name": "SPRING_DATASOURCE_URL",
          "value": "jdbc:postgresql://postgres:5432/peaksoftdb"
        },
        {
          "name": "SPRING_DATASOURCE_USERNAME",
          "value": "user"
        },
        {
          "name": "SPRING_DATASOURCE_PASSWORD",
          "value": "pass"
        },
        {
          "name": "SPRING_JPA_HIBERNATE_DDL-AUTO",
          "value": "create"
        }
      ]
    },
    {
      "name": "postgres",
      "image": "postgres:13-alpine",
      "essentials": true,
      "memory": 256,
      "portMappings": [
        {
          "hostPort": 5432,
          "containerPort": 5432
        }
      ],
      "environment": [
        {
          "name": "POSTGRES_USER",
          "value": "user"
        },
        {
          "name": "POSTGRES_PASSWORD",
          "value": "pass"
        },
        {
          "name": "POSTGRES_DB",
          "value": "peaksoftdb"
        }
      ]
    }
  ]
}

可能的错误点与修复方案

针对Docker平台(上传docker-compose.yml)的问题

  1. Compose版本兼容性:Docker running on Amazon Linux 2平台对docker-compose版本有上限,3.8版本可能不被支持,建议将version: '3.8'改为version: '3.7'后重试。
  2. 容器健康检查缺失:EB默认会检测容器健康状态,后端容器未配置健康检查时,EB可能误判容器未就绪。在backend服务中添加健康检查(需开启Spring Boot Actuator健康端点):
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8000/actuator/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    
  3. 数据库就绪延迟:depends_on仅保证postgres容器启动,不保证数据库服务就绪。后端启动时可能连接失败,可添加启动延迟脚本,或在Spring Boot中配置数据库连接重试逻辑。

针对ECS平台(Dockerrun.aws.json)的问题

  1. 内存配置与实例类型不匹配:容器内存总和为1280MB,若选择t2.micro(1GB内存)会导致资源不足,建议更换为t2.small(2GB)或更高配置的实例。
  2. 废弃的links配置:ECS中links已被网络模式替代,直接删除backend容器中的links节点即可,容器间通过服务名(postgres)可直接通信。
  3. 不必要的postgres端口映射:无需将postgres的5432端口映射到主机,删除postgres容器的portMappings节点,减少安全风险且不影响内部通信。
  4. 环境变量拼写错误:Spring Boot配置项SPRING_JPA_HIBERNATE_DDL_AUTO应为下划线,而非破折号,修正后可确保数据库初始化配置生效。
  5. 健康检查缺失:为backend容器添加健康检查配置:
    "healthCheck": {
      "command": ["CMD-SHELL", "curl -f http://localhost:8000/actuator/health || exit 1"],
      "interval": 30,
      "timeout": 10,
      "retries": 3,
      "startPeriod": 60
    }
    

通用排查建议

  • 查看EB日志:登录EB控制台,查看/var/log/eb-engine.log、/var/log/docker-events.log等日志文件,获取具体错误信息(如容器启动失败原因、数据库连接超时)。
  • 使用EB CLI部署:通过EB CLI执行部署,可查看更详细的过程输出,便于定位问题。
  • 数据库持久化配置:若需保留数据,需为postgres配置卷挂载。docker-compose中添加卷定义,Dockerrun文件中需配置mountPoints和volumes(使用EBS卷或实例存储)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:24:10