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
-
CSV
Datei befindet sich indata
Ordner innerhalb des Projekts. -
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
-
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
-
1_init.sql
Körper:CREATE TABLE table_name ( --statement body );
-
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.