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 8000

DynamoDB 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 (oder docker run), das du nie gestoppt hast.
  • Ein anderer Service belegt 8000 — ein Dev-Server, Proxy oder eine unabhängige App auf demselben Port.
  • Doppeltes Toolingserverless-dynamodb-local und serverless-offline, die beide versuchen, 8000 zu binden, oder zwei docker-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

  1. Finde, was den Port belegt:
    lsof -i :8000                       # macOS / Linux
    netstat -ano | findstr :8000        # Windows (note the PID)
  2. Stoppe diesen Prozess (oder das alte DynamoDB Local):
    kill <PID>                          # macOS / Linux
    taskkill /PID <PID> /F              # Windows
  3. 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
  4. Docker? Ändere die Host-Seite des Mappings (-p 8001:8000) und verbinde dich mit 8001.
  5. 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

Quellen

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.