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
-
CSV
o arquivo está localizado emdata
pasta dentro do projeto.
-
Na pasta do projeto há o seguintedocker-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
-
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
-
1_init.sql
corpo:
CREATE TABLE table_name ( --statement body );
-
E2_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.