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

Initialisieren Sie die Postgres-Datenbank in Docker Compose

Ich habe es geschafft, es mit benutzerdefiniertem Dockerfile zum Laufen zu bringen , hier ist meine Lösung:

Projektstruktur

data/
  datasource.csv
db/
  scripts/
    1_init.sql
    2_copy.sql
  Dockerfile
docker-compose.yml

Dateien

  1. CSV Datei befindet sich in data Ordner innerhalb des Projekts.

  2. Im Projektordner befindet sich folgende docker-compose.yml Datei:

    version: '3.3'
    
    services:
      db:
        build: ./db
        container_name: postgres
        ports:
          - "5431:6666"
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
          - POSTGRES_DB=db_name
        volumes:
          - ./data:/data
    
  3. Dockerfile enthält:

    FROM postgres:alpine
    ADD scripts/1_init.sql /docker-entrypoint-initdb.d
    ADD scripts/2_copy.sql /docker-entrypoint-initdb.d
    RUN chmod a+r /docker-entrypoint-initdb.d/*
    EXPOSE 6666
    
  4. 1_init.sql Körper:

    CREATE TABLE table_name
    (
       --statement body
    );
    
  5. Und 2_copy.sql :

    COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
    

Erklärung

1_init.sql erstellt die DB-Tabelle, sie muss die gleichen Spaltennamen wie in der CSV-Datei haben . 2_copy.sql ist für das Kopieren von Daten aus der CSV-Datei nach postgres verantwortlich.

Dockerfile verwendet Postgres-Image und kopiert alle *.sql Dateien nach /docker-entrypoint-initdb.d/ . Später werden alle Dateien in alphanumerischer Reihenfolge ausgeführt, deshalb *.sql Dateien beginnen mit Ziffern. Schließlich portieren Sie 6666 ausgesetzt ist.

docker-compose.yml baut das Dockerfile von db Ordner und machen Sie ihn über 5431 zugänglich Hafen. Als Umgebungseigenschaften werden grundlegende Postgres-Eigenschaften verwendet. Und am Ende data Ordner mit CSV-Datei wird in den Container kopiert.