Erstellen Sie einen Datenbankbenutzer mit Docker Postgres

David Mbochi Njonge 8 Oktober 2023
  1. Erstellen Sie ein neues Projekt
  2. Definieren Sie DDL für den Benutzer und die Datenbank
  3. Definieren Sie eine Dockerfile für das Image
  4. Erstellen Sie ein Bild
  5. Führen Sie einen Container aus
  6. Verbinden Sie sich mit dem Container
  7. Melden Sie sich bei PostgreSQL an
  8. Erstellen Sie eine Benutzerdatenbank ohne Skriptdatei
  9. Abschluss
Erstellen Sie einen Datenbankbenutzer mit Docker Postgres

Bei der Entwicklung von Anwendungen verwenden wir normalerweise Datenbankverwaltungssysteme wie PostgreSQL, MySQL, MongoDB und andere, um die Daten der Anwendungen aufzuzeichnen.

Docker hilft uns, eine Instanz dieser Anwendungsdatenbankverwaltungssysteme auszuführen. Dies spart Zeit und Computerspeicher, da auf dem Computer kein DBMS benötigt wird.

Jede aus diesen DBMS erstellte Datenbank hat Benutzer mit unterschiedlichen Berechtigungen für die Datenbank. In diesem Tutorial lernen wir die verschiedenen Ansätze zum Erstellen eines Datenbankbenutzers mit Docker Postgres kennen.

Erstellen Sie ein neues Projekt

Für dieses Tutorial verwenden wir die WebStorm IDE, können aber auch jede beliebige Entwicklungsumgebung verwenden. Öffnen Sie die WebStorm IDE und wählen Sie Datei > Neu > Projekt, um ein neues Projekt zu erstellen.

Wählen Sie die Option Leeres Projekt und ändern Sie im sich öffnenden Fenster den Projektnamen von unbenannt in initdb.d oder verwenden Sie einen beliebigen Namen.

Definieren Sie DDL für den Benutzer und die Datenbank

Um unserem benutzerdefinierten Image mithilfe eines PostgreSQL-Basisimages eine zusätzliche Initialisierung hinzuzufügen, müssen wir *.sql, *.sql.gz oder *.sh im Ordner /docker-entrypoint-initdb.d hinzufügen.

Da wir eine SQL-Abfrage erstellen wollen, definieren wir unsere Abfrage anhand der Datei mit der Endung .sql. Erstellen Sie eine Datei namens db-config.sql unter dem aktuellen Ordner in unserem Projekt und kopieren Sie die folgenden SQL-Anweisungen und fügen Sie sie in die Datei ein.

CREATE USER doe;
CREATE DATABASE employee_database;
GRANT ALL PRIVILEGES ON DATABASE employee_database TO doe;

Die db-config.sql wird ausgeführt, nachdem der Einstiegspunkt initdb aufruft, um den standardmäßigen Postgres-Benutzer und die Datenbank zu erstellen.

Beachten Sie, dass die Skripte in /docker-entrypoint-initdb.d nur ausgeführt werden, wenn das Datenverzeichnis leer ist. Dies bedeutet, dass während des Startvorgangs eine zuvor ausgeführte Datenbank nicht geändert wird.

Definieren Sie eine Dockerfile für das Image

Erstellen Sie eine Datei namens Dockerfile unter dem aktuellen Ordner und kopieren Sie die folgenden Anweisungen und fügen Sie sie in die Datei ein.

FROM postgres:15.1-alpine
COPY db-config.sql /docker-entrypoint-initdb.d/

“VON” - Definiert das Basisbild, auf dem ein benutzerdefiniertes Bild mit den nachfolgenden Anweisungen erstellt werden soll. In diesem Fall haben wir alpine verwendet, was uns hilft, den Speicher zu optimieren, da es sich um eine leichtgewichtige Version von PostgreSQL handelt.

KOPIEREN - Kopiert Dateien und Ordner vom Host in das Bilddateisystem. In diesem Fall haben wir die Datei db-config.sql in den Ordner /docker-entrypoint-initdb.d/ kopiert.

Erstellen Sie ein Bild

Öffnen Sie ein neues Terminalfenster mit der Tastenkombination ALTF12 auf Ihrer Tastatur und verwenden Sie den folgenden Befehl, um ein Image mit dem Tag postgres-image zu erstellen.

~/WebstormProjects/initdb.d$ docker build --tag postgres-image:latest .

Ausgang:

 => [1/2] FROM docker.io/library/postgres:15.1-alpine@sha256:cc663286e63810373bdfc91a5ed24b772447fb5282d  0.0s
 => CACHED [2/2] COPY db-config.sql /docker-entrypoint-initdb.d/                                          0.0s
 => exporting to image                                                                                    0.4s
 => => exporting layers                                                                                   0.0s
 => => writing image sha256:fd33d80c880452dcb25de1d8f7d6415eeb874039bdab176cc3d3fe1c910ebcbc              0.1s
 => => naming to docker.io/library/postgres-image:latest

Führen Sie einen Container aus

Verwenden Sie im selben Terminalfenster den folgenden Befehl, um einen PostgreSQL-Container mit dem Namen postgres-container auszuführen.

~/WebstormProjects/initdb.d$ docker run --name postgres-container -e POSTGRES_PASSWORD=postgres -d postgres-image

Ausgang:

3b8e0f85c2b4ef4b1aa28e2bad169ae796751331580af6fbba251a1c05aa4fca

Beachten Sie, dass wir im Befehl run eine Umgebungsvariable namens POSTGRES_PASSWORD verwendet haben. Beim Ausführen von PostgreSQL können wir mehrere Umgebungsvariablen übergeben, um Superuser-Details bereitzustellen, einschließlich der Datenbank und des Benutzernamens.

Die Umgebungsvariable POSTGRES_PASSWORD ist eine erforderliche Variable, die das Superuser-Passwort bereitstellt. Das Standardpasswort für PostgreSQL ist postgres.

Andere Umgebungsvariablen, die übergeben werden können, sind optional, zu denen unter anderem POSTGRES_USER, POSTGRES_DB und POSTGRES_INITDB_ARGS gehören.

Da wir den Container im Detached-Modus betreiben, können wir die Ausführung der Datei db-config.sql nicht sehen. Diese Datei wird jedoch vom Superuser im Hintergrund ausgeführt.

Verbinden Sie sich mit dem Container

Wir müssen uns über eine interaktive Shell mit dem Container verbinden, damit wir uns mit dem neuen Benutzer und der neuen Datenbank bei PostgreSQL anmelden können. Verwenden Sie dazu den folgenden Befehl, um eine Verbindung zum Container herzustellen.

~/WebstormProjects/initdb.d$ docker exec -it postgres-container bash

Ausgang:

bash-5.1#

Melden Sie sich bei PostgreSQL an

Sobald wir Zugriff auf die Container-Shell haben, verwenden Sie den folgenden Befehl, um sich bei der employee_database als Benutzer doe anzumelden.

bash-5.1# psql -d employee_database -U doe

Ausgang:

psql (15.1)
Type "help" for help.

employee_database=>

Erstellen Sie eine Benutzerdatenbank ohne Skriptdatei

Im vorherigen Abschnitt haben wir gelernt, wie man einen Datenbankbenutzer in Docker Postgres erstellt, indem man eine SQL mit der DDL zu /docker-entrypoint-initdb.d/ hinzufügt.

Es gibt einen einfacheren Ansatz, dies zu tun, ohne Skriptdateien zu schreiben. Dieser Ansatz verwendet die im vorherigen Abschnitt erwähnten Umgebungsvariablen, um die Details eines neuen Benutzers zu definieren.

Diese Umgebungsvariablen werden mit der Anweisung ENV zum Dockerfile hinzugefügt und stehen dem Container zur Verfügung. Um dies in Aktion zu sehen, ersetzen Sie die Anweisungen in der Dockerfile durch die unten angegebenen Anweisungen.

FROM postgres:15.1-alpine
ENV POSTGRES_USER=doe
ENV POSTGRES_DB=employee_database

Wiederholen Sie nach dem Hinzufügen der Umgebungsvariablen alle in den vorherigen Abschnitten behandelten Schritte, vom Erstellen eines Images, Ausführen eines Containers, Verbinden mit dem Container und Anmelden bei PostgreSQL.

Verwenden Sie für alle Schritte denselben Befehl. Stellen Sie jedoch sicher, dass Sie anhalten und den vorhandenen Behälter entfernen.

Sie können auch ein neues Image und einen neuen Container erstellen.

Abschluss

In diesem Tutorial haben wir zwei Ansätze kennengelernt, mit denen wir einen Datenbankbenutzer mit Docker Postgres erstellen können. Beim ersten Ansatz wurde ein Benutzer erstellt, indem ein SQL-Skript zu /docker-entrypoint-initdb.d/ hinzugefügt wurde, und diese Datei wurde während der Initialisierung von initdb ausgeführt.

Im zweiten Ansatz haben wir die Benutzerdetails in der Dockerfile definiert, indem wir die Docker Postgres-Umgebungsvariablen genutzt haben.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub