PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So erstellen Sie Benutzer/Datenbank im Skript für Docker Postgres

BEARBEITEN - seit dem 23. Juli 2015

Das offizielle Postgres-Docker-Image führt .sql aus Skripte, die in /docker-entrypoint-initdb.d/ gefunden werden Mappe.

Sie müssen also nur das folgende SQL-Skript erstellen:

init.sql

CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

und fügen Sie es Ihrem Dockerfile hinzu:

Dockerfile

FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/

Aber seit dem 8. Juli 2015 wenn Sie nur noch einen Benutzer und eine Datenbank erstellen müssen , ist es einfacher, einfach den POSTGRES_USER zu verwenden , POSTGRES_PASSWORD und POSTGRES_DB Umgebungsvariablen:

docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres

oder mit einem Dockerfile:

FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker

für Bilder, die älter als der 23. Juli 2015 sind

Aus der Dokumentation des Postgres-Docker-Images heißt es, dass

[...] es wird jedes *.sh-Skript, das in diesem Verzeichnis [/docker-entrypoint-initdb.d) gefunden wird, beziehen ], um weitere Initialisierungen durchzuführen, bevor der Dienst gestartet wird

Wichtig ist hier "vor dem Start des Dienstes" . Das bedeutet Ihr Skript make_db.sh wird ausgeführt, bevor der Postgres-Dienst gestartet wird, daher die Fehlermeldung "Verbindung zur Datenbank Postgres konnte nicht hergestellt werden" .

Danach gibt es eine weitere nützliche Information:

Wenn Sie im Rahmen Ihrer Initialisierung SQL-Befehle ausführen müssen, wird die Verwendung des Einzelbenutzermodus von Postgres dringend empfohlen.

Zugegeben, das kann auf den ersten Blick etwas mysteriös sein. Es besagt, dass Ihr Initialisierungsskript den Postgres-Dienst im Einzelmodus starten sollte, bevor es seine Aktionen ausführt. Sie könnten also Ihre make_db.ksh ändern Skript wie folgt und es sollte Sie dem, was Sie wollen, näher bringen:

HINWEIS , dies hat sich kürzlich im folgenden Commit geändert. Dies funktioniert mit der letzten Änderung:

export PGUSER=postgres
psql <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

Bisher die Verwendung von --single Modus wurde benötigt:

gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL