我有以下docker-compose.yml
文件:
version: '3'
services:
postgres:
image: postgres
container_name: postgres
ports:
- "5431:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=anime
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
此配置将启动Postgres数据库。在第一卷中,我定义了init.sql,它应该建立一个表:
CREATE TABLE anime (
anime_id INT PRIMARY KEY,
title TEXT
);
然后,我想用CSV文件中的数据填充Postgres数据库。
我试图向docker-compose添加另一个卷:
- ./preload.sql:/preload/preload.sql
使用该脚本:
copy anime FROM 'docker/data/AnimeList.csv' DELIMITER ',' CSV HEADER;
CSV文件位于data
文件夹中的docker-compose.yml
文件夹中。
但是它不起作用。数据库已正确创建,但是没有表和数据。当我连接到Docker容器时,运行'psql
命令并尝试获取anime
表,我得到以下错误:
Did not find any relation named "anime".
我的问题是:如何在docker-compose中用CSV数据文件预加载Postgres容器?
答案 0 :(得分:0)
我设法使用自定义label total works = "result from SQL query Nr 1"
label paused works = "result from SQL query Nr 2"
label canceled works = "result from SQL query Nr 3"
使它正常工作,这是我的解决方案:
Dockerfile
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
文件位于项目内部的CSV
文件夹中。在项目文件夹中,有以下data
文件:
docker-compose.yml
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
FROM postgres:alpine
COPY *.sql /docker-entrypoint-initdb.d/
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
和CREATE TABLE table_name
(
--statement body
);
:
2_copy.sql
COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
创建数据库表,它必须具有与CSV文件中相同的列名。 1_init.sql
负责将数据从CSV复制到Postgres。
2_copy.sql
使用postgres图像并将所有Dockerfile
文件复制到*.sql
。后来,所有文件都按字母数字顺序执行,这就是/docker-entrypoint-initdb.d/
文件以数字开头的原因。最后,端口*.sql
被暴露。
6666
从docker-compose.yml
文件夹构建Dockerfile
,并使其可通过db
端口访问。作为环境性质,使用基本的postgres性质。然后将带有CSV文件的5431
文件夹复制到容器中。