DynamoDB Local: Address already in use (port 8000)
TL;DR — DynamoDB Local bindet standardmäßig Port 8000, und etwas hält ihn bereits — ein früheres DynamoDB Local, das du nicht gestoppt hast, ein anderer Dienst oder ein doppelter serverless-offline/Container. Gib entweder Port 8000 frei oder starte Local mit -port auf einem anderen Port (und richte deinen Client darauf aus).
Was es bedeutet
Exception in thread "main" java.net.BindException: Address already in use
... Failed to bind to port 8000DynamoDB Local ist ein Java-Prozess, der einen Listening-Socket auf Port 8000 öffnet. Wenn dieser Port bereits gebunden ist, kann die JVM ihn nicht beanspruchen und beendet sich mit BindException. Es ist rein ein lokaler Portkonflikt — nichts mit AWS oder Credentials zu tun.
Warum es passiert
- Ein vorheriges DynamoDB Local läuft noch — ein früheres
java -jar DynamoDBLocal.jar(oderdocker run), das du nie gestoppt hast. - Ein anderer Service belegt 8000 — ein Dev-Server, Proxy oder eine unabhängige App auf demselben Port.
- Doppeltes Tooling —
serverless-dynamodb-localundserverless-offline, die beide versuchen, 8000 zu binden, oder zweidocker-compose up-Stacks. - Eine abgestürzte Instanz ließ den Port kurz gebunden (
TIME_WAIT), oder ein Zombie-Container.
Serverless und Test-Runner
Das Plugin serverless-dynamodb-local und Jest-globalSetup-Hooks starten Local
oft implizit — führst du zusätzlich von Hand docker run -p 8000:8000 amazon/dynamodb-local
aus, stirbt der zweite Bind-Versuch mit BindException, obwohl Local längst
gesund läuft. Entscheide dich pro Maschinen-Sitzung für genau einen Launcher.
Unter macOS sind verwaiste Java-Prozesse aus dem Test-Runner der IDE ein häufiger
Übeltäter — lsof -i :8000 zeigt oft java mit einer PID aus einem früheren
Gradle-Lauf.
So behebst du es
- Finde, was den Port belegt:
lsof -i :8000 # macOS / Linux netstat -ano | findstr :8000 # Windows (note the PID) - Stoppe diesen Prozess (oder das alte DynamoDB Local):
kill <PID> # macOS / Linux taskkill /PID <PID> /F # Windows - Oder starte DynamoDB Local auf einem anderen Port und aktualisiere deinen Client:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -port 8001 # then: endpoint = http://localhost:8001 - Docker? Ändere die Host-Seite des Mappings (
-p 8001:8000) und verbinde dich mit8001. - Entferne doppelte Plugins/Stacks, sodass nur ein Prozess versucht, den Port zu binden.
In DynoTable
Nachdem du Port 8000 freigegeben (oder Local auf -port 8001 verschoben) hast,
installiere DynoTable und lege unter Einstellungen → Profile →
Profil hinzufügen ein Local-Profil an: Endpoint http://localhost:8000 (oder dein
alternativer Port), eine Platzhalter-Region und alphanumerische Dummy-Credentials.
Verbindung testen bestätigt, dass der Emulator lauscht, bevor du Tabellen
durchsiehst. Schritt für Schritt: Running DynamoDB Local ·
Connect to DynamoDB Local & LocalStack lesen.
Wenn du den Port wechselst, passe den Profil-Endpoint mit an — ein Profil, das noch
auf :8000 zeigt, während Local auf :8001 lauscht, erzeugt
connection refused, auch
nachdem der Bind-Konflikt gelöst ist. Der DynamoDB JSON Converter
hilft, Seed-Daten zu laden, sobald Local erreichbar ist.
Verwandte Fehler
- Unable to start DynamoDB Local process — der Emulator startet aus anderen Gründen nicht (Java, native Libs).
- Could not connect to DynamoDB Local (ECONNREFUSED) — die Kehrseite: nichts lauscht dort, wo du anwählst.
- Learn: Running DynamoDB Local
Quellen
- Deploying DynamoDB locally on your computer — AWS DynamoDB Developer Guide (default port 8000; "If port 8000 is unavailable, this command throws an exception")
- DynamoDB local usage notes — AWS DynamoDB Developer Guide (the
-portcommand line option and full flag list) - amazon/dynamodb-local — Docker Hub (official image and port mapping)