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

Initialiser Postgres db i Docker Compose

Det lykkedes mig at få det til at fungere ved hjælp af tilpasset Dockerfile , her er min løsning:

Projektstruktur

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

Filer

  1. CSV filen er placeret i data mappe inde i projektet.

  2. I projektmappen er der følgende 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 indeholder:

    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 krop:

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

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

Forklaring

1_init.sql opretter DB-tabellen, den skal have de samme kolonnenavne som i CSV-filen . 2_copy.sql er ansvarlig for at kopiere data fra CSV'en til postgres.

Dockerfile bruger postgres-billede og kopierer alt *.sql filer til /docker-entrypoint-initdb.d/ . Senere udføres alle filer i alfanumerisk rækkefølge, det er derfor *.sql filer starter med cifre. Til sidst port 6666 er afsløret.

docker-compose.yml bygger Dockerfile fra db mappe og gør den tilgængelig via 5431 Havn. Som miljøegenskaber anvendes basale postgres egenskaber. Og til sidst data mappe med CSV-fil kopieres til containeren.




  1. MySQL:liste over sum for flere betingelser i én SQL-sætning

  2. Opdele kæmpe (95 Mb) JSON-array i mindre bidder?

  3. ajax data respons altid 0 i php mysql

  4. Kopiér fra csv til tabel med id seriel kolonne auto-incrementing PSQL