sql >> Database >  >> RDS >> PostgreSQL

Initialiseer Postgres db in Docker Compose

Het is me gelukt om het te laten werken met een aangepast Dockerfile , hier is mijn oplossing:

Projectstructuur

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

Bestanden

  1. CSV bestand bevindt zich in data map in het project.

  2. In de projectmap staat de volgende docker-compose.yml bestand:

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

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

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

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

Uitleg

1_init.sql maakt de DB-tabel, deze moet dezelfde kolomnamen hebben als in het CSV-bestand . 2_copy.sql is verantwoordelijk voor het kopiëren van gegevens van de CSV naar postgres.

Dockerfile gebruikt postgres-afbeelding en kopieert alle *.sql bestanden naar /docker-entrypoint-initdb.d/ . Later worden alle bestanden in alfanumerieke volgorde uitgevoerd, daarom *.sql bestanden beginnen met cijfers. Ten slotte, poort 6666 wordt blootgesteld.

docker-compose.yml bouwt het Dockerfile van db map en maak deze toegankelijk via 5431 haven. Als milieu-eigenschappen worden basis postgres-eigenschappen gebruikt. En aan het eind data map met CSV-bestand wordt naar de container gekopieerd.




  1. Haal queryresultaten op als dict in SQLAlchemy

  2. MIN() versus LEAST() in MySQL:wat is het verschil?

  3. SQL:Selecteer het laatste record voor elke dag gegeven datetime

  4. Node.js kan niet verifiëren bij MySQL 8.0