Sono riuscito a farlo funzionare utilizzando Dockerfile
personalizzato , ecco la mia soluzione:
Struttura del progetto
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
File
-
CSV
il file si trova indata
cartella all'interno del progetto. -
Nella cartella del progetto c'è il seguente
docker-compose.yml
file: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
contiene: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
corpo:CREATE TABLE table_name ( --statement body );
-
E
2_copy.sql
:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Spiegazione
1_init.sql
crea la tabella DB, deve avere gli stessi nomi di colonna del file CSV . 2_copy.sql
è responsabile della copia dei dati dal CSV a postgres.
Dockerfile
utilizza l'immagine postgres e copia tutti i *.sql
file in /docker-entrypoint-initdb.d/
. Successivamente, tutti i file vengono eseguiti in ordine alfanumerico, ecco perché *.sql
i file iniziano con le cifre. Infine, porta 6666
è esposto.
docker-compose.yml
crea il Dockerfile
da db
cartella e rendila accessibile tramite 5431
porta. Come proprietà ambientali vengono utilizzate le proprietà postgres di base. E alla fine data
la cartella con il file CSV viene copiata nel contenitore.