如何设置将数据从CSV文件加载到Docker容器中的PostgreSQL数据库的路径?

问题描述:

我想将数据从CSV文件加载到Docker中的PostgreSQL数据库中。 我运行:如何设置将数据从CSV文件加载到Docker容器中的PostgreSQL数据库的路径?

docker exec -ti my project_db_1 psql -U postgres 

然后我选择我的数据库:

\c myDatabase 

现在,我尝试从myfile.csv这是在Django项目的主目录为backend_data表加载数据:

\copy backend_data (t, sth1, sth2) FROM 'myfile.csv' CSV HEADER; 

但是我得到的错误:

myfile.csv: No such file or directory 

在我看来,我尝试了所有可能的路径,没有任何工作。任何想法如何解决它?这是我的搬运工,compose.yml:

version: '3' 

services: 
    db: 
    image: postgres 
    environment: 
     POSTGRES_USER: myuser 
     POSTGRES_PASSWORD: mypassword 
    django: 
    build: . 
    command: python3 manage.py runserver 0.0.0.0:8000 
    volumes: 
     - .:/code 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 
+0

哪个容器是'myfile.csv' in,'django'或'db'?你要进入哪个容器? 'django'或'db'? – Alasdair

+0

@Alasdair'myfile.csv'在主目录中,其中也是'docker-compose.yml'和'Dockerfile'的Django项目。我执行'\ copy backend_data(t,sth1,sth2)FROM'myfile.csv'CSV HEADER;'in'project_db_1''。 – wahtdbogh

+0

您没有为'db'容器装载任何卷,文件'myfile.csv'不在'db'容器中,并且您正在该容器中运行该命令。在docker-compose.yml'卷中添加可能的解决方案: - “”' –

最简单的方法是将一个目录挂载到Postgres容器,放置文件到安装目录,并引用它。

我们实际上正在安装pgdata目录,以确保即使重新创建postgres泊坞窗容器,postgres数据仍然存在。所以,我的例子也将使用pgdata

services: 
    db: 
    image: postgres 
    environment: 
     POSTGRES_USER: myuser 
     POSTGRES_PASSWORD: mypassword 
    volumes: 
    volumes: 
     - "<path_to_local_pgdata>:/var/lib/postgresql/data/pgdata" 

myfile.csv<path_to_local_pgdata>(相对于包含配置或绝对路径的目录)。复制命令,然后看起来是这样的:

\copy backend_data (t, sth1, sth2) FROM '/var/lib/postgresql/data/pgdata/myfile.csv' CSV HEADER; 
+0

并且'local_pgdata'必须位于主目录中? – wahtdbogh

+0

如果它是一个相对路径,那么'local_pgdata'必须与主目录相对,是的。 – Risadinha

+0

'docker-compose.yml'应该是' - “。/ local_pgdata:/ var/lib/postgresql/data/pgdata“'谢谢你的帮助 – wahtdbogh

你需要安装myfile.csv的路径在db容器,如果你正在运行在该容器中的命令。

您可能已将该文件仅安装在django服务中。

可能docker-compose.yml

version: '3' 

services: 
    db: 
    image: postgres 
    environment: 
     POSTGRES_USER: myuser 
     POSTGRES_PASSWORD: mypassword 
    volumes: 
     - <path_to_csv_in_local>:<path_of_csv_in_db_container> 
    django: 
    build: . 
    command: python3 manage.py runserver 0.0.0.0:8000 
    volumes: 
     - .:/code 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 

您尚未创建db的坐骑。这会在您关闭数据库容器后发生致命的行为(您将丢失所有数据)。 postgresql集装箱数据存储在/var/lib/postgresql/data。您需要将此路径安装到本地系统,以便即使容器关闭也可以维护数据。

volumes: 
    - <path_of_db_in_local_system>:/var/lib/postgresql/data 
+0

如何检查我的'path_of_db_in_local_system'? – wahtdbogh

+0

你可以将它设置为任何你想要的东西(并且可以被docker访问服务)..它将成为存储在你的容器中的任何数据(基本上是django应用程序在postgres上执行的任何基于模型的操作)将复制到本地系统的路径,这样即使容器由于 –

+0

好的,但是我应该有两个卷:和':/ var/lib/postgresql/data'或者它是相同的? – wahtdbogh