Udało mi się go uruchomić za pomocą niestandardowego Dockerfile
, oto moje rozwiązanie:
Struktura projektu
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
Pliki
-
CSV
plik znajduje się wdata
folder wewnątrz projektu. -
W folderze projektu znajduje się następujący
Wersjadocker-compose.yml
plik: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
zawiera: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
ciało:CREATE TABLE table_name ( --statement body );
-
I
2_copy.sql
:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Wyjaśnienie
1_init.sql
tworzy tabelę DB, musi mieć takie same nazwy kolumn jak w pliku CSV . 2_copy.sql
odpowiada za kopiowanie danych z pliku CSV do postgres.
Dockerfile
używa obrazu postgres i kopiuje wszystkie *.sql
pliki do /docker-entrypoint-initdb.d/
. Później wszystkie pliki są wykonywane w kolejności alfanumerycznej, dlatego *.sql
pliki zaczynają się od cyfr. Wreszcie port 6666
jest narażony.
docker-compose.yml
buduje Dockerfile
z db
folder i udostępnij go przez 5431
Port. Jako właściwości środowiskowe stosuje się podstawowe właściwości postgresu. A na końcu data
folder z plikiem CSV jest kopiowany do kontenera.