webentwicklung-frage-antwort-db.com.de

Erstellen Sie einen Postgres-Docker-Container mit dem anfänglichen Schema

Ich möchte Docker-Dateien erstellen, die bereits vorhandene Firmendatenbanken darstellen. Ebenso möchte ich eine Docker-Datei erstellen, die mit der Wiederherstellung eines psql-Dumps beginnt.

Ich habe meine psql_dump.sql in dem . Verzeichnis.

FROM postgres
ADD . /init_data
run "createdb" "--template=template0" "my_database"
run  "psql" "-d" "my_database"  --command="create role my_admin superuser"
run  "psql" "my_database" "<" "init_data/psql_dump.sql"

Ich dachte, das wäre gut genug, um es zu tun. Ich möchte Lösungen vermeiden, die ein .sh Skript. Wie diese Lösung .

Ich verwende template0, da in der psql-Dokumentation angegeben ist, dass Sie dieselben Benutzer erstellen müssen, die sich in der ursprünglichen Datenbank befanden, und Sie müssen die Datenbank vor der Wiederherstellung mit template0 erstellen.

Es gibt mir jedoch einen Fehler:

createdb: could not connect to database template1: could not connect to server: No such file or directory
        Is the server running locally and accepting

Ich verwende Docker Compose auch für die gesamte Anwendung. Wenn es besser ist, dieses Problem in Docker-Compose zu lösen, würde ich gerne das Basis-psql-Image und dafür Docker Compose verwenden.

33
jQwierdy

Laut Verwendungshinweis für das offizielle PostreSQL Docker-Image benötigen Sie lediglich:

Dockerfile

FROM postgres
ENV POSTGRES_DB my_database
COPY psql_dump.sql /docker-entrypoint-initdb.d/

Die Umgebungsvariable POSTGRES_DB Weist den Container an, beim ersten Ausführen ein my_database - Schema zu erstellen.

Und jede .sql - Datei, die sich im /docker-entrypoint-initdb.d/ Des Containers befindet, wird ausgeführt.

Wenn Sie .sh - Skripte ausführen möchten, können Sie diese auch im Verzeichnis /docker-entrypoint-initdb.d/ Bereitstellen.

41
Thomasleveil

Wie in den Kommentaren erwähnt, ist die Antwort von @Thomasleveil großartig und einfach, wenn Ihre Schema-Neuerstellung schnell ist. Aber in meinem Fall ist es langsam und ich wollte Docker-Volumes verwenden

  1. Verwenden Sie zuerst das Docker-Image wie in @Thomasleveil answer, um einen Container mit postgres mit der gesamten Schema-Initialisierung zu erstellen

Dockerfile:

FROM postgres
WORKDIR /docker-entrypoint-initdb.d
ADD psql_dump.sql /docker-entrypoint-initdb.d
EXPOSE 5432
  1. führen Sie es dann aus und erstellen Sie ein neues lokales Verzeichnis, das die postgres-Daten enthält, nachdem sie aus der Datei "psql_dump.sql" ausgefüllt wurden: docker cp mypg:/var/lib/postgresql/data ./postgres-data

  2. Kopieren Sie die Daten in einen temporären Datenordner und starten Sie einen neuen Postgres-Docker-Compose-Container, dessen Volume sich im neuen temporären Datenordner befindet:

startPostgres.sh:

rm -r ./temp-postgres-data/data
mkdir -p ./temp-postgres-data/data
cp -r ./postgres-data/data ./temp-postgres-data/
docker-compose -p mini-postgres-project up

und die docker-compose.yml-Datei ist:

version: '3'
services:
  postgres:
    container_name: mini-postgres
    image: postgres:9.5
    ports:
    - "5432:5432"
    volumes:
      - ./temp-postgres-data/data:/var/lib/postgresql/data

Jetzt können Sie die Schritte 1 und 2 auf einem neuen Computer ausführen oder wenn sich Ihre psql_dump.sql ändert. Und jedes Mal, wenn Sie eine neue saubere (aber bereits initialisierte) Datenbank möchten, können Sie nur startPostgres.sh ab Schritt 3 ausführen. Und es werden immer noch Docker-Volumes verwendet.

6
yishaiz