本地Docker运行DynamoDB:内外连接看到不同数据表的问题
问题解答
本地版DynamoDB不会根据连接来源的URL创建独立环境,你遇到的数据隔离问题,核心原因有两个:
1. 连接的是两个完全独立的DynamoDB实例
你本地终端用http://localhost:8000访问的是通过docker run -p 8000:8000 amazon/dynamodb-local启动的Docker容器内的DynamoDB;而Docker内部程序用http://docker.for.mac.localhost:8000访问的是你的Mac主机本身运行的DynamoDB实例(大概率是你之前直接在Mac本地启动的,比如用官方jar包运行)。这两个实例完全独立,数据自然不互通。
2. 未启用共享数据库模式(默认行为导致客户端隔离)
即使连接的是同一个DynamoDB实例,默认情况下本地DynamoDB会为每个不同的客户端(基于访问时的标识信息,比如AWS_ACCESS_KEY_ID)生成单独的数据库文件,这也会造成不同客户端看到的数据不一致。
解决方案
方案一:统一连接到同一个Docker内的DynamoDB实例
推荐使用Docker网络实现容器间通信,避免依赖主机端口映射:
- 创建专属Docker网络:
docker network create dynamodb-net - 启动DynamoDB容器时加入该网络,并启用共享数据库:
docker run -d --name dynamodb-local --network dynamodb-net -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb - 本地终端连接时用
localhost:8000:aws dynamodb --endpoint-url http://localhost:8000 list-tables - Docker内的程序连接时用容器名作为地址:
http://dynamodb-local:8000
方案二:持久化数据并确保单实例访问
如果需要数据不随容器重启丢失,启动时挂载本地目录作为数据卷,并强制共享数据库:
docker run -d --name dynamodb-local -p 8000:8000 -v /your/local/data/path:/home/dynamodblocal/data amazon/dynamodb-local -jar DynamoDBLocal.jar -dbPath /home/dynamodblocal/data -sharedDb
将/your/local/data/path替换为你本地的实际目录,这样所有连接都会读写同一个持久化的数据库文件。
内容的提问来源于stack exchange,提问作者Ro Anders
相关产品推荐
相关产品推荐

