Docker部署DynamoDB Local时本地创建表失败问题排查
排查Docker环境下Django应用连接本地DynamoDB的连接拒绝问题
核心问题分析
你在本地用aws cli能连localhost:8000的DynamoDB,但Docker里的Django应用用localhost就报错,本质是Docker容器的localhost和宿主的localhost不是同一个网络空间,容器里的localhost指向自身,而非宿主或其他容器。
具体排查步骤
替换endpoint地址为Docker服务名
在Docker Compose环境中,服务之间通过服务名(即docker-compose.yml里定义的服务名称,比如你的dynamodb-local)进行网络通信,把代码里的endpoint_url从http://localhost:8000改成http://dynamodb-local:8000。
示例代码:import boto3 dynamodb = boto3.resource( 'dynamodb', endpoint_url='http://dynamodb-local:8000', region_name='us-east-1', aws_access_key_id='dummy', aws_secret_access_key='dummy' )验证DynamoDB服务的运行状态
- 用
docker ps查看dynamodb-local容器是否正常启动,有没有退出或重启记录。 - 查看容器日志确认服务就绪:
docker logs <dynamodb-local-container-id>,如果看到Initializing DynamoDB Local with...的日志,说明服务已启动。 - 检查端口映射:确保
docker-compose.yml里dynamodb-local的端口配置是8000:8000,宿主端口和容器端口映射正确。
- 用
确保服务启动顺序正确
Docker Compose默认并行启动服务,可能Django启动时DynamoDB还没初始化完成。给Django服务添加依赖和健康检查,让它等DynamoDB就绪后再启动:services: django-app: build: ./backend depends_on: dynamodb-local: condition: service_healthy # 其他配置... dynamodb-local: image: amazon/dynamodb-local:latest ports: - "8000:8000" healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8000 || exit 1"] interval: 5s timeout: 5s retries: 5排查容器内网络连通性
- 进入Django容器:
docker exec -it <django-app-container-id> /bin/bash - 测试服务名解析:
ping dynamodb-local,如果能ping通说明DNS没问题。 - 测试端口连通:
telnet dynamodb-local 8000,如果连接成功,说明网络层面没问题;如果失败,检查两个服务是否在同一个Docker网络(默认Compose会创建专属网络,所有服务自动加入)。
- 进入Django容器:
检查boto3配置的其他细节
确保没有其他配置覆盖了endpoint_url,比如环境变量AWS_ENDPOINT_URL或者boto3的全局配置文件(~/.aws/config)。如果用环境变量传递endpoint,要保证变量值是http://dynamodb-local:8000而非localhost。
内容的提问来源于stack exchange,提问作者TechSelfLearner
相关产品推荐
相关产品推荐

