Docker Compose部署DynamoDB Local遇表不存在错误求助
问题:DynamoDB Local 启动应用时提示表不存在错误
Docker Compose 配置
volumes: dynamo-db: driver: local services: dynamodb-local: container_name: local-db image: amazon/dynamodb-local restart: always command: -jar DynamoDBLocal.jar -sharedDb -dbPath /home/dynamodblocal/ volumes: - dynamo-db:/home/dynamodblocal ports: - '8000:8000' env_file: - ...
错误日志
ResourceNotFoundException: Cannot do operations on a non-existent table 2023-02-06T23:13:33.829569752Z at Request.extractError (/srv/node_modules/aws-sdk/lib/protocol/json.js:52:27) 2023-02-06T23:13:33.829573169Z at Request.callListeners (/srv/node_modules/aws-sdk/lib/sequential_executor.js:106:20) 2023-02-06T23:13:33.829576085Z at Request.emit (/srv/node_modules/aws-sdk/lib/sequential_executor.js:78:10) 2023-02-06T23:13:33.829578835Z at Request.emit (/srv/node_modules/aws-sdk/lib/request.js:686:14) 2023-02-06T23:13:33.829581502Z at Request.transition (/srv/node_modules/aws-sdk/lib/request.js:22:10) 2023-02-06T23:13:33.829584252Z at AcceptorStateMachine.runTo (/srv/node_modules/aws-sdk/lib/state_machine.js:14:12) 2023-02-06T23:13:33.829587169Z at /srv/node_modules/aws-sdk/lib/state_machine.js:26:10 2023-02-06T23:13:33.829601794Z at Request.<anonymous> (/srv/node_modules/aws-sdk/lib/request.js:38:9) 2023-02-06T23:13:33.829605460Z at Request.<anonymous> (/srv/node_modules/aws-sdk/lib/request.js:688:12) 2023-02-06T23:13:33.829608252Z at Request.callListeners (/srv/node_modules/aws-sdk/lib/sequential_executor.js:116:18) 2023-02-06T23:13:33.829610960Z message: Cannot do operations on a non-existent table 2023-02-06T23:13:33.829613585Z code: ResourceNotFoundException 2023-02-06T23:13:33.829616169Z requestId: 40aaa8a1-575f-45be-b8b1-e64fb28c9cb4 2023-02-06T23:13:33.829618710Z statusCode: 400
已排查情况
- 已在Docker Compose中配置
-sharedDb参数并指定数据存储路径 - 应用仅修改了DynamoDB的URL,其他配置在生产/测试环境可正常运行
- 使用技术栈:Node.js 16 + Dynamoose
解决建议
1. 确认本地实例中是否存在目标表
通过aws-cli连接本地DynamoDB,列出所有表:
aws dynamodb list-tables --endpoint-url http://localhost:8000
若未查询到目标表,需手动创建或检查应用的表初始化逻辑是否正常执行。
2. 验证Dynamoose的本地实例配置
确保Dynamoose明确指向本地端点,且配置了本地所需的占位凭证:
const dynamoose = require('dynamoose'); // 本地DynamoDB无需真实凭证,配置占位值即可 dynamoose.aws.sdk.config.update({ accessKeyId: 'dummy-key', secretAccessKey: 'dummy-secret', region: 'us-east-1' }); // 指定本地DynamoDB端点 dynamoose.aws.ddb.local('http://localhost:8000');
3. 检查数据卷的挂载与权限
- 验证容器内数据目录的权限与内容:
docker exec local-db ls -l /home/dynamodblocal/
- 若权限异常或旧数据卷存在脏数据,可删除旧卷后重新启动:
docker-compose down -v docker-compose up -d
4. 确认应用表初始化时机
若依赖Dynamoose自动创建表,需确保模型配置中开启自动创建与等待表就绪:
const UserSchema = new dynamoose.Schema({ /* 表结构定义 */ }); const UserModel = dynamoose.model('User', UserSchema, { create: true, // 开启自动创建表 waitForActive: true // 等待表创建完成再执行后续操作 });
5. 验证-sharedDb参数是否生效
进入容器检查进程启动命令,确认-sharedDb参数已正确加载:
docker exec local-db ps aux
若参数未出现在进程命令中,需检查Docker Compose的command格式是否正确(注意参数顺序与空格)。
内容的提问来源于stack exchange,提问作者pawcio
相关产品推荐
相关产品推荐

