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

Docker Compose中app-node提前连接dynamodb-local导致连接失败求助

解决Docker Compose中app-node提前连接dynamodb-local的问题

你的问题核心在于depends_on仅能保证dynamodb-local容器启动,无法确保其内部的DynamoDB服务完全就绪。app-node启动后立刻执行AWS CLI命令时,dynamodb-local的8000端口还未开放,导致连接失败。以下是几种可行的解决方案:

方案1:健康检查+依赖条件

给dynamodb-local添加健康检查配置,让app-node等待服务就绪后再启动:

version: '3.8'
services:
 dynamodb-local:
   command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
   image: "amazon/dynamodb-local:latest"
   container_name: dynamodb-local
   ports:
     - "8000:8000"
   volumes:
     - "./docker/dynamodb:/home/dynamodblocal/data"
   working_dir: /home/dynamodblocal
   healthcheck:
     test: ["CMD-SHELL", "curl -f http://localhost:8000/ || exit 1"]
     interval: 2s
     timeout: 5s
     retries: 10
 app-node:
   depends_on:
     dynamodb-local:
       condition: service_healthy
   image: amazon/aws-cli
   container_name: app-node
   ports:
    - "8080:8080"
   environment:
     AWS_ACCESS_KEY_ID: 'DUMMYIDEXAMPLE'
     AWS_SECRET_ACCESS_KEY: 'DUMMYEXAMPLEKEY'
   command:
     dynamodb describe-limits --endpoint-url http://dynamodb-local:8000 --region us-west-2

健康检查会每2秒尝试访问dynamodb-local的本地端口,最多重试10次,直到服务响应。app-node通过service_healthy条件等待,确保DynamoDB服务可用后再执行命令。

方案2:命令中加入重试逻辑

直接修改app-node的启动命令,循环重试直到连接成功:

version: '3.8'
services:
 dynamodb-local:
   command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
   image: "amazon/dynamodb-local:latest"
   container_name: dynamodb-local
   ports:
     - "8000:8000"
   volumes:
     - "./docker/dynamodb:/home/dynamodblocal/data"
   working_dir: /home/dynamodblocal
 app-node:
   depends_on:
     - dynamodb-local
   image: amazon/aws-cli
   container_name: app-node
   ports:
    - "8080:8080"
   environment:
     AWS_ACCESS_KEY_ID: 'DUMMYIDEXAMPLE'
     AWS_SECRET_ACCESS_KEY: 'DUMMYEXAMPLEKEY'
   command: >
     sh -c "
       until dynamodb describe-limits --endpoint-url http://dynamodb-local:8000 --region us-west-2; do
         echo 'Waiting for DynamoDB to be ready...'
         sleep 2
       done
     "

通过shell循环执行目标命令,每次失败后等待2秒重试,直到命令成功执行。

方案3:使用wait-for-it脚本

如果需要更灵活的等待逻辑,可以挂载wait-for-it脚本到容器中:

  1. 下载wait-for-it脚本到本地./docker/scripts目录
  2. 修改docker-compose.yml:
version: '3.8'
services:
 dynamodb-local:
   command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
   image: "amazon/dynamodb-local:latest"
   container_name: dynamodb-local
   ports:
     - "8000:8000"
   volumes:
     - "./docker/dynamodb:/home/dynamodblocal/data"
   working_dir: /home/dynamodblocal
 app-node:
   depends_on:
     - dynamodb-local
   image: amazon/aws-cli
   container_name: app-node
   ports:
    - "8080:8080"
   volumes:
     - "./docker/scripts/wait-for-it.sh:/wait-for-it.sh"
   environment:
     AWS_ACCESS_KEY_ID: 'DUMMYIDEXAMPLE'
     AWS_SECRET_ACCESS_KEY: 'DUMMYEXAMPLEKEY'
   command: >
     sh -c "
       chmod +x /wait-for-it.sh && /wait-for-it.sh dynamodb-local:8000 -- dynamodb describe-limits --endpoint-url http://dynamodb-local:8000 --region us-west-2
     "

wait-for-it脚本会等待指定的主机和端口就绪后,再执行后续的AWS CLI命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:10:18