PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Initialiser la base de données Postgres dans Docker Compose

J'ai réussi à le faire fonctionner en utilisant un Dockerfile personnalisé , voici ma solution :

Structure du projet

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

Fichiers

  1. CSV le fichier est situé dans data dossier à l'intérieur du projet.

  2. Dans le dossier du projet, il y a le suivant docker-compose.yml fichier :

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

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

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

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

Explication

1_init.sql crée la table DB, elle doit avoir les mêmes noms de colonne que dans le fichier CSV . 2_copy.sql est responsable de la copie des données du CSV vers postgres.

Dockerfile utilise l'image postgres et copie tous les *.sql fichiers vers /docker-entrypoint-initdb.d/ . Plus tard, tous les fichiers sont exécutés dans l'ordre alphanumérique, c'est pourquoi *.sql les fichiers commencent par des chiffres. Enfin, portez 6666 est exposé.

docker-compose.yml construit le Dockerfile de db dossier et rendez-le accessible via 5431 Port. Comme propriétés environnementales, des propriétés postgres de base sont utilisées. Et à la fin data dossier avec le fichier CSV est copié dans le conteneur.