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
-
CSV
le fichier est situé dansdata
dossier à l'intérieur du projet. -
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
-
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
-
1_init.sql
corps :CREATE TABLE table_name ( --statement body );
-
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.