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脚本到容器中:
- 下载wait-for-it脚本到本地
./docker/scripts目录 - 修改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
相关产品推荐
相关产品推荐

