PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Inizializza Postgres db in Docker Compose

Sono riuscito a farlo funzionare utilizzando Dockerfile personalizzato , ecco la mia soluzione:

Struttura del progetto

data/
  datasource.csv
db/
  scripts/
    1_init.sql
    2_copy.sql
  Dockerfile
docker-compose.yml

File

  1. CSV il file si trova in data cartella all'interno del progetto.

  2. Nella cartella del progetto c'è il seguente docker-compose.yml file:

    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
    
  3. Dockerfile contiene:

    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
    
  4. 1_init.sql corpo:

    CREATE TABLE table_name
    (
       --statement body
    );
    
  5. E 2_copy.sql :

    COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
    

Spiegazione

1_init.sql crea la tabella DB, deve avere gli stessi nomi di colonna del file CSV . 2_copy.sql è responsabile della copia dei dati dal CSV a postgres.

Dockerfile utilizza l'immagine postgres e copia tutti i *.sql file in /docker-entrypoint-initdb.d/ . Successivamente, tutti i file vengono eseguiti in ordine alfanumerico, ecco perché *.sql i file iniziano con le cifre. Infine, porta 6666 è esposto.

docker-compose.yml crea il Dockerfile da db cartella e rendila accessibile tramite 5431 porta. Come proprietà ambientali vengono utilizzate le proprietà postgres di base. E alla fine data la cartella con il file CSV viene copiata nel contenitore.