Manueller Postgres Build in Docker

Wie kann ich PostgreSQL manuell in einem Dockercontainer builden, und mich mit diesem dann verbinden?
Mein Dockerfile sieht so aus, aber ich bekomme keine Verbindung hin:

FROM ubuntu:20.04
ENV DEBIAN_FRONTEND noninteractive
# Install some tools
RUN apt-get update && apt-get install -y g++ clang-7 llvm-7 python make python2.7-dev bison flex libreadline-dev zlib1g-dev perl
COPY . /psql
RUN cd /psql && ./configure --with-llvm && make -j6 && make install 
RUN useradd -ms /bin/bash postgres && mkdir /data && chown postgres /data
# postgres as admin user
USER postgres
RUN /usr/local/pgsql/bin/initdb /data
# allow remote connections
VOLUME  ["/data", "/usr/local/pgsql"]
# Set the default command to run when starting the container
EXPOSE 5042
CMD /usr/local/pgsql/bin/pg_ctl -D /data start 
#run psql, just for the lols
#CMD /usr/local/pgsql/bin/createdb autodiff
#CMD /usr/local/pgsql/bin/psql autodiff

Wie kann ich mich danach mit dem Server verbinden? WEnn ich die letzten Zeilen drin lasse, dann heißt es, er würde den Server nicht finden können, während wenn ich sie nicht drin habe, bekomme ich ja das Problem, das ich nicht mehr den psql-Comand habe, oder nicht?

Ins blaue rein: PostgreSQL ist auf Port 5432 und du exposed den Port 5042. Dann musst das umschreiben.

vielleicht so

docker run -it --entrypoint /bin/bash <image>

Warum buildest Du im container? Du hast die dazu notwendigen Tools dann mit drin.
Und braucht man diese USER Sache?

@Xandrian Das könnte es tatsächlich sein, danke, darüber habe ich nicht nachgedacht … aber wenn ich es richtig verstanden habe, dann muss ich doch jetzt noch irgendwie damit connecten, und dafür brauche ich doch eine eigene Installation des PSQL-Clients, oder? Und wie connecte ich dann damit?

psql -h >?< -U postgres -p >?< #was muss hier in die ? rein? 

@pogomips WEil ich auf meiner Maschine build schwierigkeit habe, und deswegen jetzt erstmal versuchen möchte mit einem cleanen Build zu arbeiten und dann zu schauen, ob es am Code liegt, oder an meiner maschine … die INstallation ist nicht ganz die gleiche, es sind weitere Datentypen und LLVM-Extensions hinzugekommen …

Hostname ist die IP des Docker-Containers. Musst du halt ermitteln. Der Port wäre in deinem Fall der 5042. ABER du musst halt noch dafür sorgen, dass dieser intern auf localhost:5432 gemappt wird… Sonst wird das nichts…

Eigentlich ist das hier wie bei jeden Docker-Container. Dein Problem ist kein PostgreSQL-Problem sondern ein Anwendungsproblem mit Docker…

@Xandrian das müsste hiermit ja abgedeckt sein, oder?

EXPOSE 5042
CMD /usr/local/pgsql/bin/pg_ctl -D /data -o "-p 5042" start

Ich weiß, das es kein PostgreSQL-Problem direkt ist, aber wenn du grade helfen kannst, wäre ich dir natürlich sehr verbunden :slightly_smiling_face:

Ein EXPOSE 5042 sorg nur dafür, dass der Port 5042 vom Docker-Container nach extern weiter gereicht wird. Im Container selbst lauscht aber da kein Dienst.

Entweder passt du die PostgreSQL-Konfiguration so an, dass der Server auf diesem Port lauscht, oder du änderst die EXPOSE-Bedingung so, dass der externe Port auf einen anderen internen Port weitergereicht wird.

Ohne das jetzt zu prüfen müsste es ein EXPOSE 5042:5432 sein. Lies doch einfach einmal die Dokumentation von Docker. Die ist sehr ausführlich…