Docker部署本地DynamoDB后连接超时的解决方法
解决DynamoDB Local容器超时问题
问题场景
通过以下Docker Compose文件创建了名为dynamodb的容器:
version: '3.8' services: dynamodb-local: command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data" image: "amazon/dynamodb-local:latest" container_name: dynamodb ports: - "8000:8000" volumes: - "./data/dynamodb:/home/dynamodblocal/data" working_dir: /home/dynamodblocal dynamodb-init: depends_on: - dynamodb-local image: amazon/aws-cli environment: AWS_ACCESS_KEY_ID: dummy-key-id AWS_SECRET_ACCESS_KEY: dummy-key command: >- dynamodb create-table --table-name Foo --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --billing-mode PAY_PER_REQUEST --endpoint-url http://dynamodb-local:8000 --region dummy-region
执行docker compose up -d后,容器显示正常运行:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7f8b152c7ea8 amazon/dynamodb-local:latest "java -jar DynamoDBL…" 14 seconds ago Up 11 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp dynamodb
但执行以下AWS CLI命令时出现超时:
aws dynamodb list-tables --endpoint http://localhost:8000 --profile akhakpouri
错误信息:Read timeout on endpoint URL: "http://localhost:8000/"
解决方案
检查本地端口8000是否被占用
用命令查看端口占用情况:# Linux/macOS lsof -i :8000 # Windows netstat -ano | findstr :8000如果有其他进程占用8000端口,要么停止该进程,要么修改Compose文件中的端口映射(比如改成
8001:8000),然后重启容器。验证AWS CLI配置的凭证是否匹配
你的akhakpouri配置文件中,AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY需要和Compose中初始化容器用的dummy-key-id、dummy-key一致,或者直接在命令中指定凭证:aws dynamodb list-tables --endpoint http://localhost:8000 --region dummy-region --access-key dummy-key-id --secret-key dummy-key也可以临时设置环境变量:
export AWS_ACCESS_KEY_ID=dummy-key-id export AWS_SECRET_ACCESS_KEY=dummy-key aws dynamodb list-tables --endpoint http://localhost:8000 --region dummy-region确认DynamoDB容器是否真正就绪
depends_on只保证容器启动顺序,不确保服务完全就绪。可以手动进入容器测试服务是否正常:docker exec -it dynamodb curl http://localhost:8000如果返回
DynamoDB Local相关页面,说明服务正常;如果没响应,可能是容器内服务启动失败,查看容器日志:docker logs dynamodb根据日志排查问题,比如数据卷权限问题,确保本地
./data/dynamodb目录有读写权限。检查网络连通性
尝试用curl直接访问本地端口:curl http://localhost:8000如果curl也超时,说明端口映射可能有问题,检查Docker是否有权限绑定端口,或者重启Docker服务后重新启动容器。
内容的提问来源于stack exchange,提问作者Ali Khakpouri
相关产品推荐
相关产品推荐

