Det lykkedes mig at få det til at fungere ved hjælp af tilpasset Dockerfile
, her er min løsning:
Projektstruktur
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
Filer
-
CSV
filen er placeret idata
mappe inde i projektet. -
I projektmappen er der følgende
docker-compose.yml
fil: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
indeholder: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
krop:CREATE TABLE table_name ( --statement body );
-
Og
2_copy.sql
:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Forklaring
1_init.sql
opretter DB-tabellen, den skal have de samme kolonnenavne som i CSV-filen . 2_copy.sql
er ansvarlig for at kopiere data fra CSV'en til postgres.
Dockerfile
bruger postgres-billede og kopierer alt *.sql
filer til /docker-entrypoint-initdb.d/
. Senere udføres alle filer i alfanumerisk rækkefølge, det er derfor *.sql
filer starter med cifre. Til sidst port 6666
er afsløret.
docker-compose.yml
bygger Dockerfile
fra db
mappe og gør den tilgængelig via 5431
Havn. Som miljøegenskaber anvendes basale postgres egenskaber. Og til sidst data
mappe med CSV-fil kopieres til containeren.