DynamoDB Locale: indirizzo già in uso (porta 8000)

TL;DR — DynamoDB Local associa la porta 8000 per impostazione predefinita e qualcosa la contiene già: un DynamoDB Local precedente che non hai interrotto, un altro servizio o un contenitore/serverless-offline duplicato. Libera la porta 8000 o avvia Local su una porta diversa con -port (e punta il tuo client su di essa).

Cosa significa

Exception in thread "main" java.net.BindException: Address already in use
   ... Failed to bind to port 8000

DynamoDB Local è un processo Java che apre un socket in ascolto sulla porta 8000. Se quella porta è già associata, la JVM non può rivendicarla ed esce con BindException. È puramente un conflitto di porta locale: niente a che fare con AWS o credenziali.

Perché succede

  • Un precedente DynamoDB Local è ancora in esecuzione — un precedente java -jar DynamoDBLocal.jar (o docker run) non è mai stato interrotto.
  • Un altro servizio possiede 8000: un server di sviluppo, proxy o app non correlata sulla stessa porta.
  • Strumenti duplicati: serverless-dynamodb-local e serverless-offline tentano entrambi di associare 8000 o due stack docker-compose up.
  • Un'istanza bloccata ha lasciato brevemente la porta (TIME_WAIT) o un contenitore zombie.

Serverless e test runner

Il plugin serverless-dynamodb-local e gli hook Jest globalSetup vengono spesso avviati Locale implicitamente: se esegui anche docker run -p 8000:8000 amazon/dynamodb-local manualmente, il secondo tentativo di associazione termina con "BindException" anche se Local lo è già sano. Scegli un launcher per sessione della macchina.

Su macOS, i processi Java orfani di un test runner IDE sono spesso colpevoli — lsof -i :8000 mostra spesso java con un PID di una precedente esecuzione di Gradle.

Come risolverlo

  1. Trova a chi appartiene il porto:
    lsof -i :8000                       # macOS / Linux
    netstat -ano | findstr :8000        # Windows (note the PID)
  2. Interrompi il processo (o il vecchio DynamoDB Local):
    kill <PID>                          # macOS / Linux
    taskkill /PID <PID> /F              # Windows
  3. Oppure esegui DynamoDB Local su una porta diversa e aggiorna il tuo client:
    java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -port 8001
    # then: endpoint = http://localhost:8001
  4. Docker? Cambia il lato host della mappatura (-p 8001:8000) e connettiti a 8001.
  5. Rimuovi plugin/stack duplicati in modo che solo un processo tenti di associare la porta.

In DynoTable

Dopo aver liberato la porta 8000 (o spostato Locale su -port 8001), install DynoTable e aggiungi un profilo locale in Impostazioni → Profili → Aggiungi profilo: imposta endpoint "http://localhost:8000" (o la porta alternativa), una regione segnaposto e credenziali fittizie alfanumeriche. Test connessione conferma che l'emulatore è ascoltare prima di sfogliare le tabelle. Procedura dettagliata: In esecuzione DynamoDB Locale · Connetti a DynamoDB Locale e LocalStack.

Quando cambi porta, aggiorna l'endpoint del profilo in modo che corrisponda: un profilo ancora che punta a ":8000" mentre Local ascolta ":8001" produce connessione rifiutata anche dopo che il conflitto di associazione è stato risolto. Il convertitore DynamoDB JSON aiuta a caricare i dati seed una volta che Local è raggiungibile.

Errori correlati

Fonti

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.