Docker & Postgres: kan tcp 0.0.0.0:5432 adres niet binden dat al in gebruik is

Ik probeer postgres te starten in een docker-container op mijn Mac, maar ik krijg steeds de volgende foutmelding

docker: Foutreactie van daemon: stuurprogramma kan externe connectiviteit niet programmeren op eindpunt postgres (8392b9e5cfaa28f480fe1009dee461f97e82499726f4afc4e916358dd2d2f61e): Fout bij starten van userland-proxy: binden van tcp 0.0.0.0:5432 adres is al in gebruik.

Ik heb postgres lokaal geïnstalleerd, maar ik ben ermee gestopt en actief

pg_ctl status

retouren

pg_ctl: geen server actief

Ik heb het volgende uitgevoerd om te controleren wat er draait op 5432

lsof -i tcp:5432

&

netstat -anp tcp | grep 5432

en er draait niets op de poort.

Versies

Mac – OS X El Capitan versie 10.11.2

PostgreSQL – 9.5

Docker – Docker versie 1.12.0-rc2, build 906eacd, experimenteel


Antwoord 1, autoriteit 100%

Als lsof -i :5432geen uitvoer laat zien, kun je sudo ss -lptn 'sport = :5432'gebruiken om te zien welk proces gebonden is naar de haven.

Ga verder met kill <pid>


Antwoord 2, autoriteit 60%

Als je lsof -i :5432uitvoert op de host, kun je zien welk proces aan de poort is gebonden.

Er is een exemplaar van Postgres actief. Je kunt kill <pid>uitvoeren om het te doden als je wilt. U kunt ook 5432gebruiken in plaats van 5432:5432in uw docker-opdracht of docker-compose-bestand en docker automatisch de hostpoort laten kiezen.


Antwoord 3, autoriteit 35%

Het eerste dat u moet doen, is de PostgreSQL-service stoppen.
In de meeste gevallen is het probleem hiermee verholpen.

sudo service postgresql stop

Als bovenstaande niet werkt. voeg vervolgens de volgende regel toe aan /etc/postgresql/12/main/postgresql.conf

sudo vim /etc/postgresql/12/main/postgresql.conf
## good if you add under CONNECTION AND AUTHENTICATION comments
listen_addresses = "*"

Antwoord 4, autoriteit 3%

In sommige gevallen is het van cruciaal belang om een ​​meer diepgaande foutopsporing voor het probleem uit te voeren voordat de container/het proces wordt gestopt of beëindigd.

Overweeg de onderstaande checklist te volgen:

1) Controleer uw huidige docker-opstelomgeving
Voer docker-compose psuit.
Als de poort in gebruik is door een andere container, stop deze dan met docker-compose stop <service-name-in-compose-file>of verwijder het door stopte vervangen door rm.

2) Controleer de containers die buiten uw huidige werkruimte draaien
Voer docker psuit om een ​​lijst te zien van alle containers die onder uw host draaien.
Als u merkt dat de poort in gebruik is door een andere container, kunt u deze stoppen met docker stop <container-id>.
(*) Omdat u niet onder het bereik van de oorspronkelijke compose-omgeving valt, is het een goede gewoonte om eerst docker inspectom meer informatie te verzamelen over de container die u gaat stoppen.

3) Controleer of poort wordt gebruikt door andere processen die op de host draaien
Als de poort bijvoorbeeld 6379 is, voer dan het volgende uit:

$ sudo netstat -ltnp | grep ':6379'
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      915/redis-server 12 
tcp6       0      0 ::1:6379                :::*                    LISTEN      915/redis-server 12

(*) U kunt ook de lsofgebruiken commando dat voornamelijk wordt gebruikt om informatie op te halen over bestanden die door verschillende processen worden geopend (ik raad aan om daarvoor netstatuit te voeren).

Dus, in het geval van de uitvoer boven de PIDis 915. Nu kunt u het volgende uitvoeren:

$ ps j 915
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1   915   915   915 ?           -1 Ssl    123   0:11 /usr/bin/redis-server 127.0.0.1:6379

En bekijk de ID van het bovenliggende proces (PPID) en het uitvoeringscommando.
U kunt ook het volgende uitvoeren: $ pstree -s <PID>voor een visuele weergave van het proces en de bijbehorende processen (installeren met: brew install pstree).

In ons geval kunnen we zien dat het proces waarschijnlijk een daemon is (PPID is 1) – Overweeg in dat geval het volgende uit te voeren:
A) $ cat /proc/<PID>/statusom meer diepgaande informatie over het proces te krijgen, zoals het aantal threads dat door het proces is voortgekomen, de mogelijkheden, enz’.
B) $ systemctl status <PID>om de -eenheid die de creatie van een specifiek proces heeft veroorzaakt. Als de service niet kritiek is, kunt u stop en schakel de service uit.

4) Herstart Docker-service
Voer sudo service docker restartuit.

5) Je hebt dit punt bereikt en..
Alleen als het uw systeem niet in gevaar brengt, kunt u overwegen de server opnieuw op te starten.


Antwoord 5

Ga naar project en klik op docker-compose.yml

version: '2'

diensten:
web:
bouwen: .
poorten:
– “8000:8000”
volumes:
– .:/app
koppelingen:
– db
– mail server
db:
afbeelding: “postgres”
omgeving:
POSTGRES_PASSWORD: jager2
poorten:
– “5432:9432”
mail server:
afbeelding: “mailhog/mailhog”
bloot:
– 1025
poorten:
– “8026:8026”


verander de poorten in 8026:8026 omdat er al een andere container draait op dit poortnummer verander alleen het poortnummer”


Antwoord 6

Geen van deze andere antwoorden werkte voor mij. (Bijvoorbeeld, lsof en netstat hebben alleen lege regels geretourneerd.) Het volgende werkte echter:

sudo -u postgres pg_ctl -D /Library/PostgreSQL/13/data stop

Antwoord 7

het heeft voor mij gewerkt, waarschijnlijk moet je stoppen met postgres :

sudo systemctl stop postgresql

Antwoord 8

Ik heb geprobeerd sudo kill -9 <PID>te gebruiken om het postgres-proces uit te schakelen, maar het verschijnt steeds weer met een andere PID. Daarna ontdekte ik dat het een proces opslaat onder LaunchDemosen dat het bij elke opstart wordt uitgevoerd:

  • cd /Library/LaunchDemos/
  • sudo rm com.edb.launchd.postgresql-13.plist
  • Start uw pc opnieuw op om wijzigingen toe te passen.

Antwoord 9

Als je sudo lsof -i :5432 op de host uitvoert, kun je zien welk proces aan de poort is gebonden.

- sudo service postgresql stop
- while lsof -Pi :5432 -sTCP:LISTEN -t; do sleep 1; done

Other episodes