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
-
CSV
tệp nằm trongdata
thư mục bên trong dự án. -
Trong thư mục dự án có
docker-compose.yml
sau 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
-
Dockerfile
chứ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.sql
nộ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.