Het is me gelukt om het te laten werken met een aangepast Dockerfile , hier is mijn oplossing:
Projectstructuur
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
Bestanden
-
CSVbestand bevindt zich indatamap in het project. -
In de projectmap staat de volgende
docker-compose.ymlbestand: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 -
Dockerfilebevat: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.sqllichaam:CREATE TABLE table_name ( --statement body ); -
En
2_copy.sql:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Uitleg
1_init.sql maakt de DB-tabel, deze moet dezelfde kolomnamen hebben als in het CSV-bestand . 2_copy.sql is verantwoordelijk voor het kopiëren van gegevens van de CSV naar postgres.
Dockerfile gebruikt postgres-afbeelding en kopieert alle *.sql bestanden naar /docker-entrypoint-initdb.d/ . Later worden alle bestanden in alfanumerieke volgorde uitgevoerd, daarom *.sql bestanden beginnen met cijfers. Ten slotte, poort 6666 wordt blootgesteld.
docker-compose.yml bouwt het Dockerfile van db map en maak deze toegankelijk via 5431 haven. Als milieu-eigenschappen worden basis postgres-eigenschappen gebruikt. En aan het eind data map met CSV-bestand wordt naar de container gekopieerd.