Успях да го накарам да работи с персонализиран Dockerfile
, ето моето решение:
Структура на проекта
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
Файлове
-
CSV
файл се намира вdata
папка вътре в проекта. -
В папката на проекта има следния
docker-compose.yml
файл: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
съдържа: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
тяло:CREATE TABLE table_name ( --statement body );
-
И
2_copy.sql
:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Обяснение
1_init.sql
създава DB таблицата, тя трябва да има същите имена на колони като в CSV файла . 2_copy.sql
отговаря за копирането на данни от CSV в postgres.
Dockerfile
използва postgres изображение и копира всички *.sql
файлове към /docker-entrypoint-initdb.d/
. По-късно всички файлове се изпълняват в буквено-цифров ред, затова *.sql
файловете започват с цифри. И накрая, порт 6666
е изложено.
docker-compose.yml
изгражда Dockerfile
от db
папка и я направете достъпна чрез 5431
порт. Като свойства на околната среда се използват основни свойства на postgres. И накрая data
папка с CSV файл се копира в контейнера.