Podařilo se mi to zprovoznit pomocí vlastního Dockerfile
, zde je moje řešení:
Struktura projektu
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
Soubory
-
CSV
soubor je umístěn vdata
složky uvnitř projektu. -
Ve složce projektu je následující
docker-compose.yml
soubor: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
obsahuje: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
tělo:CREATE TABLE table_name ( --statement body );
-
A
2_copy.sql
:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Vysvětlení
1_init.sql
vytvoří tabulku DB, musí mít stejné názvy sloupců jako v souboru CSV . 2_copy.sql
je zodpovědný za kopírování dat z CSV do postgres.
Dockerfile
používá postgres image a zkopíruje všechny *.sql
soubory do /docker-entrypoint-initdb.d/
. Později jsou všechny soubory spouštěny v alfanumerickém pořadí, proto *.sql
soubory začínají číslicemi. Nakonec port 6666
je vystavena.
docker-compose.yml
vytvoří Dockerfile
z db
složku a zpřístupněte ji prostřednictvím 5431
přístav. Jako environmentální vlastnosti se používají základní postgresové vlastnosti. A na konci data
složka se souborem CSV se zkopíruje do kontejneru.