%20vorhanden%20ist%2C%20auch%20wenn%20es%20nicht%20ausgef%C3%BChrt%20wird%3F.png)
Ich habe einen Containerstapel (angegeben durch docker-compose.yml
). Der Stapel erfordert eine PostgreSQL-Datenbank, aber ich verwende eine lokal ausgeführte native Instanz, anstatt sie Teil des Stapels zu machen (um beispielsweise Backups zu vereinfachen und Ressourcen zu sparen). Die PostgreSQL-Instanz ist so eingestellt, dass sie bindet und auf lauscht 172.17.0.1
, die IP, unter der der Host von Docker-Containern aus erreichbar ist.
Beim Systemstart bindet sich PostgreSQL jedoch nicht an diese Adresse und die Container können anschließend nicht initialisiert werden. Wenn ich PostgreSQL danach neu starte, kann ich sehen, dass es gebunden ist (über ss
), und die Container werden problemlos initialisiert. Dies ist bei jedem Start zu 100 % reproduzierbar.
Ich denke, das liegt daran, dass die Schnittstelle noch nicht existiert und es daher nichts gibt, woran man binden kann. Gibt es eine Möglichkeit, das Netzwerk (oder die Schnittstelle) „beizubehalten“, sodass daran gebunden werden kann, auch wenn Docker noch nicht initialisiert wurde?
(Ich habe auch versucht, dies After=docker.service
in der systemd-Servicedatei für PostgreSQL anzugeben, aber ohne Erfolg. Ich denke, es liegt daran, dass Docker zwar bereits initialisiert wurde, die Container-Stacks jedoch nicht und die Netzwerke daher auch noch nicht erstellt wurden. Soweit ich weiß, ist es nicht möglich, in systemd „Warten, bis ein Docker-Container gestartet wurde“ anzugeben.)
Antwort1
Ich habe mich mit demselben Problem befasst. Ich habe eine Lösung gefunden, aber sie gefällt Ihnen vielleicht nicht. Wenn Sie listen_addresses
in Ihrem Postgresql auf setzen '*'
, wird es stattdessen an die Adresse gebunden 0.0.0.0
, die Datenverkehr von allen Schnittstellen empfängt. Ich habe bestätigt, dass dies auf mehreren Servern problemlos funktioniert.
Ja, es ist eine Sünde, Ihren DB-Server an Ihre öffentliche Adresse binden zu lassen. Sie sollten jedoch bereits UFW haben, das externen Datenverkehr blockiert, plus eine strenge Konfiguration, die pg_hba
nur Verbindungen zu den entsprechenden DBs aus dem Docker-Subnetz zulässt, plus nur lokale Unix-Authentifizierung für das postgres
Superuser-Konto und sichere Passwörter für alle anderen Konten, also nehme ich an, dass es sicher genug ist. Es funktioniert zumindest, und ich konnte keine andere Möglichkeit finden, es zum Laufen zu bringen.