DynamoDB Local: Address already in use (port 8000)
TL;DR — DynamoDB Local 默认绑定端口 8000,而某个东西已经占用了它——一个你没停止的先前的 DynamoDB Local、另一个服务,或一个重复的 serverless-offline/容器。要么释放端口 8000,要么用 -port 在其他端口上启动 Local(并让你的客户端指向它)。
含义
Exception in thread "main" java.net.BindException: Address already in use
... Failed to bind to port 8000DynamoDB Local 是一个 Java 进程,它在端口 8000 上打开一个监听套接字。如果那个端口已被绑定,JVM 就无法占用它并以 BindException 退出。这纯粹是一次本地端口冲突——与 AWS 或凭证无关。
为什么会发生
- 一个先前的 DynamoDB Local 仍在运行——一个你从未停止的先前的
java -jar DynamoDBLocal.jar(或docker run)。 - 另一个服务占用了 8000——同一端口上的一个开发服务器、代理或无关应用。
- 重复的工具——
serverless-dynamodb-local和serverless-offline都试图绑定 8000,或者两个docker-compose up栈。 - 一个崩溃的实例短暂地留下了被绑定的端口(
TIME_WAIT),或一个僵尸容器。
Serverless and test runners
serverless-dynamodb-local 插件和 Jest globalSetup 挂钩经常启动隐式本地 - 如果你还运行 docker run -p 8000:8000 amazon/dynamodb-local
手动,第二次绑定尝试会因 BindException 而终止,即使 Local 是已经很健康了。每个计算机会话选择一个启动器。在 macOS 上,来自 IDE 测试运行程序的孤立 Java 进程是常见的罪魁祸首
— lsof -i :8000 通常会显示 java 以及早期 Gradle 运行中的 PID。
如何修复
- 找出占用端口的东西:
lsof -i :8000 # macOS / Linux netstat -ano | findstr :8000 # Windows (note the PID) - 停止那个进程(或旧的 DynamoDB Local):
kill <PID> # macOS / Linux taskkill /PID <PID> /F # Windows - 或者在其他端口上运行 DynamoDB Local并更新你的客户端:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -port 8001 # then: endpoint = http://localhost:8001 - Docker? 更改映射的主机侧(
-p 8001:8000)并连接到8001。 - 移除重复的插件/栈,让只有一个进程尝试绑定该端口。
在 DynoTable 中
释放端口 8000(或将 Local 移至-port 8001)后,install DynoTable
并在 Settings → Profiles → 添加 Profile 中添加本地配置文件:设置端点
http://localhost:8000(或你的备用端口),占位符区域,以及字母数字虚拟凭证。 Test Connection确认模拟器是在浏览表格之前先听一下。演练:
Running DynamoDB Local·
Connect to DynamoDB Local & LocalStack。当你更改端口时,更新配置文件端点以匹配 - 配置文件仍然当 Local 监听 :8001 时,指向 :8000 会产生
connection refused偶数绑定冲突解决后。 DynamoDB JSON converter
一旦本地可达,帮助加载种子数据。
相关错误
- Unable to start DynamoDB Local process——模拟器因其他原因(Java、原生库)启动失败。
- Could not connect to DynamoDB Local (ECONNREFUSED)——反面:你拨号的地方没有任何东西在监听。
- 学习:Running DynamoDB Local
来源
- Deploying DynamoDB locally on your computer — AWS DynamoDB Developer Guide(默认端口8000;“如果端口8000不可用,该命令会抛出异常”)
- DynamoDB local usage notes — AWS DynamoDB Developer Guide(
-port命令行选项和完整标志列表) - amazon/dynamodb-local — Docker Hub(官方镜像和端口映射)