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
-
CSV
el archivo se encuentra endata
carpeta dentro del proyecto. -
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
-
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
-
1_init.sql
cuerpo:CREATE TABLE table_name ( --statement body );
-
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.