sql >> Databasteknik >  >> RDS >> PostgreSQL

Initiera Postgres db i Docker Compose

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

  1. CSV filen finns i data mapp inuti projektet.

  2. 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
    
  3. 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
    
  4. 1_init.sql body:

    CREATE TABLE table_name
    (
       --statement body
    );
    
  5. 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.




  1. lägga till flera värden i en kolumn

  2. Replikering från MySQL till MS SQL

  3. Infogar ny rad med en trigger på samma tabell

  4. Optimeringströsklar – gruppering och aggregering av data, del 4