Saya berhasil membuatnya bekerja menggunakan Dockerfile khusus , inilah solusi saya:
Struktur proyek
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
File
-
CSVfile terletak didatafolder di dalam proyek. -
Di folder proyek ada
docker-compose.ymlberikut ini berkas: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 -
Dockerfileberisi: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.sqltubuh:CREATE TABLE table_name ( --statement body ); -
Dan
2_copy.sql:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Penjelasan
1_init.sql membuat tabel DB, harus memiliki nama kolom yang sama seperti pada file CSV . 2_copy.sql bertanggung jawab untuk menyalin data dari CSV ke postgres.
Dockerfile menggunakan gambar postgres dan menyalin semua *.sql file ke /docker-entrypoint-initdb.d/ . Kemudian, semua file dieksekusi dalam urutan alfanumerik, itulah sebabnya *.sql file dimulai dengan angka. Terakhir, port 6666 terungkap.
docker-compose.yml membangun Dockerfile dari db folder dan membuatnya dapat diakses melalui 5431 Pelabuhan. Sebagai properti lingkungan, properti postgres dasar digunakan. Dan di akhir data folder dengan file CSV disalin ke penampung.