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 8000DynamoDB 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(odocker 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-localeserverless-offlinetentano entrambi di associare 8000 o due stackdocker-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
- Trova a chi appartiene il porto:
lsof -i :8000 # macOS / Linux netstat -ano | findstr :8000 # Windows (note the PID) - Interrompi il processo (o il vecchio DynamoDB Local):
kill <PID> # macOS / Linux taskkill /PID <PID> /F # Windows - 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 - Docker? Cambia il lato host della mappatura (
-p 8001:8000) e connettiti a8001. - 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
- Impossibile avviare DynamoDB Processo locale — l'emulatore non si avvia per altri motivi (Java, librerie native).
- Impossibile connettersi a DynamoDB Locale (ECONNREFUSED) - il rovescio della medaglia: niente è in ascolto dove componi.
- Impara: In esecuzione DynamoDB Locale
Fonti
- Distribuzione di DynamoDB localmente sul computer — AWS DynamoDB Guida per gli sviluppatori (porta predefinita 8000; "Se la porta 8000 non è disponibile, questo comando genera un'eccezione")
- DynamoDB note sull'utilizzo locale — AWS DynamoDB Guida per gli sviluppatori (l'opzione della riga di comando
-porte l'elenco completo dei flag) - amazon/dynamodb-local — Docker Hub (immagine ufficiale e mappatura delle porte)