Ich versuche, eine Dockerfile aus dem Postgres-Image zu erstellen. Der Repo sagt, dass die Initialisierung behandelt werden sollte, indem ein Shell-Skript in /docker-entrypoint-initdb.d/ platziert wird. Ich habe das folgende Skript basierend auf einem Beispiel, das ich online gefunden habe:
%Vor%Die umgekehrten Schrägstriche scheinen erforderlich zu sein, da sonst ein Parse-Fehler auftritt. Das Skript wird ohne Fehler ausgeführt und alle Befehle mit Ausnahme der CREATE TABLE-Befehle scheinen einen Effekt zu haben.
Wird die Tabellenerstellung im Einzelbenutzermodus nicht unterstützt? Wenn ja, gibt es eine bessere Möglichkeit, ein Dockerfile mit Tabellen zu erstellen, die in Postgres erstellt wurden?
@a_horse_with_no_name hat mich mit seinem Kommentar auf die richtige Spur gebracht. Ich entschied mich dafür, den Single-User-Modus zu verlassen, auch wenn es "empfohlen" wurde. Stattdessen starte ich Postgre mit pg_ctl, lade einige SQL-Dateien mit meinen Tabellenkreationen und stoppe den Server mit pg_ctl.
Mein Shell-Skript sieht so aus:
%Vor%Wenn Sie verhindern wollen, dass PostgreSQL für Benutzer zugänglich ist, bevor Sie mit der Installation beginnen, starten Sie sie nur mit Loopback-Zugriff oder nur mit einem Unix-Socket, initialisieren Sie sie und starten Sie sie für den allgemeinen Zugriff neu.
>Ich spreche Docker nicht, aber wenn du das in einer normalen Umgebung machst, würdest du so etwas tun wie:
%Vor% d. Starten Sie PostgreSQL nicht auf TCP / IP-Sockets und mit einem nicht standardmäßigen unix_socket_directories
. Mach dein Setup. Dann starte es mit dem Standard (oder konfiguriert) unix_socket_directories
und listen_addresses
neu, sobald es für den allgemeinen Zugriff bereit ist.
Stattdessen könnten Sie:
pg_hba.conf
, um nur den Zugriff von Ihrem Setup-Benutzer / nur für die Loopback-Adresse / etc pg_hba.conf
durch die Produktion pg_ctl reload
oder SELECT pg_reload_conf()
, um die neuen Einstellungen zu laden und den allgemeinen Zugriff zu erlauben ... dies wird jedoch den Anwendungen ermöglichen, sich zu verbinden und dann ihre Authentifizierung während der Einrichtungsphase abzulehnen; das ist vielleicht nicht das, was Sie wollen, und nicht alle Anwendungen bewältigen das richtig.
Ich habe dein Skript getestet und es funktioniert fast gut. Mit Postgresql 9.4 habe ich folgendes geschafft:
%Vor% Grundsätzlich musste ich das Skript in zwei Teile aufteilen, da sich der PostgreSQL beschwert hat, dass das create database
nicht in mehrzeiligen Skripts verwendet werden kann. Und der andere war, nur den Datenbanknamen orpheus
für den zweiten Befehl hinzuzufügen.
Und voilà
Tags und Links postgresql docker dockerfile