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
-
CSV
bestand bevindt zich indata
map in het project. -
In de projectmap staat de volgende
docker-compose.yml
bestand: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
bevat: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
lichaam: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.