sql >> Base de Datos >  >> RDS >> PostgreSQL

Inicialice Postgres db en Docker Compose

Me las arreglé para que funcione usando Dockerfile personalizado , aquí está mi solución:

Estructura del proyecto

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

Archivos

  1. CSV el archivo se encuentra en data carpeta dentro del proyecto.

  2. En la carpeta del proyecto se encuentra el siguiente docker-compose.yml archivo:

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

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

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

Explicación

1_init.sql crea la tabla DB, debe tener los mismos nombres de columna que en el archivo CSV . 2_copy.sql es responsable de copiar datos del CSV a postgres.

Dockerfile usa la imagen de postgres y copia todo *.sql archivos a /docker-entrypoint-initdb.d/ . Posteriormente, todos los archivos se ejecutan en orden alfanumérico, por eso *.sql los archivos comienzan con dígitos. Finalmente, puerto 6666 está expuesto.

docker-compose.yml construye el Dockerfile de db carpeta y hacerlo accesible a través de 5431 Puerto. Como propiedades ambientales se utilizan propiedades básicas de postgres. Y al final data la carpeta con el archivo CSV se copia en el contenedor.