Jag lyckades få det att fungera med hjälp av anpassad Dockerfile
, här är min lösning:
Projektstruktur
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
Filer
-
CSV
filen finns idata
mapp inuti projektet. -
I projektmappen finns följande
docker-compose.yml
fil: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
innehåller: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
body:CREATE TABLE table_name ( --statement body );
-
Och
2_copy.sql
:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Förklaring
1_init.sql
skapar DB-tabellen, måste den ha samma kolumnnamn som i CSV-filen . 2_copy.sql
ansvarar för att kopiera data från CSV till postgres.
Dockerfile
använder postgres-bild och kopierar alla *.sql
filer till /docker-entrypoint-initdb.d/
. Senare körs alla filer i alfanumerisk ordning, det är därför *.sql
filer börjar med siffror. Slutligen port 6666
är utsatt.
docker-compose.yml
bygger Dockerfile
från db
mapp och gör den tillgänglig via 5431
hamn. Som miljöegenskaper används grundläggande postgres-egenskaper. Och i slutet data
mapp med CSV-fil kopieras till behållaren.