Tôi đã quản lý để làm cho nó hoạt động bằng cách sử dụng Dockerfile tùy chỉnh , đây là giải pháp của tôi:
Cấu trúc dự án
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
Tệp
-
CSVtệp nằm trongdatathư mục bên trong dự án. -
Trong thư mục dự án có
docker-compose.ymlsau tệp: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 -
Dockerfilechứa: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.sqlnội dung:CREATE TABLE table_name ( --statement body ); -
Và
2_copy.sql:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
Giải thích
1_init.sql tạo bảng DB, bảng này phải có các tên cột giống như trong tệp CSV . 2_copy.sql chịu trách nhiệm sao chép dữ liệu từ CSV sang bưu điện.
Dockerfile sử dụng hình ảnh postgres và sao chép tất cả *.sql tệp tới /docker-entrypoint-initdb.d/ . Sau đó, tất cả các tệp được thực thi theo thứ tự chữ và số, đó là lý do tại sao *.sql các tệp bắt đầu bằng các chữ số. Cuối cùng, cổng 6666 được tiếp xúc.
docker-compose.yml xây dựng Dockerfile từ db và làm cho nó có thể truy cập được thông qua 5431 Hải cảng. Khi thuộc tính môi trường, các thuộc tính cơ bản của postgres được sử dụng. Và ở cuối data thư mục có tệp CSV được sao chép vào vùng chứa.