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
-
CSVDatei befindet sich indataOrdner innerhalb des Projekts. -
Im Projektordner befindet sich folgende
docker-compose.ymlDatei: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 -
Dockerfileenthä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.sqlKö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.