PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Inicialize o banco de dados Postgres no Docker Compose


Consegui fazê-lo funcionar usando Dockerfile personalizado , aqui está minha solução:

Estrutura do projeto

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

Arquivos


  1. CSV o arquivo está localizado em data pasta dentro do projeto.

  2. Na pasta do projeto há o seguinte docker-compose.yml Arquivo:
    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 contém:
    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 corpo:
    CREATE TABLE table_name
    (
       --statement body
    );
    

  5. E 2_copy.sql :
    COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
    

Explicação


1_init.sql cria a tabela de banco de dados, ela deve ter os mesmos nomes de coluna que no arquivo CSV . 2_copy.sql é responsável por copiar os dados do CSV para o postgres.

Dockerfile usa a imagem postgres e copia todos os *.sql arquivos para /docker-entrypoint-initdb.d/ . Posteriormente, todos os arquivos são executados em ordem alfanumérica, por isso *.sql os arquivos começam com dígitos. Por fim, porta 6666 está exposto.

docker-compose.yml cria o Dockerfile de db pasta e torná-lo acessível através de 5431 porta. Como propriedades ambientais são usadas propriedades básicas do postgres. E no final data pasta com arquivo CSV é copiada para o contêiner.