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

Posted

技术标签:

【中文标题】如何设置路径以将 CSV 文件中的数据加载到 Docker 容器中的 PostgreSQL 数据库中?【英文标题】:How can I set path to load data from CSV file into PostgreSQL database in Docker container? 【发布时间】:2018-04-01 15:37:37 【问题描述】:

我想将数据从 CSV 文件加载到 Docker 中的 PostgreSQL 数据库中。 我跑:

docker exec -ti my project_db_1 psql -U postgres

然后我选择我的数据库:

\c myDatabase

现在我尝试将 Django 项目主目录中的myfile.csv 中的数据加载到backend_data 表中:

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

但是我得到错误:

myfile.csv: No such file or directory

在我看来,我尝试了所有可能的路径,但没有任何效果。任何想法我该如何解决?这是我的 docker-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

【问题讨论】:

myfile.csv 在哪个容器中,djangodb?您正在执行哪个容器? djangodb? @Alasdair myfile.csv 位于主目录中,其中也是 Django 项目的 docker-compose.ymlDockerfile。我在project_db_1 中执行\copy backend_data (t, sth1, sth2) FROM 'myfile.csv' CSV HEADER; 您没有为db 容器安装任何卷,文件myfile.csv 不在db 容器中,并且您正在该容器中运行命令。可能的解决方案添加 docker-compose.yml volumes: - "<path_to_csv_in_local>:<path_to_csv_in_db_container>" 【参考方案1】:

最简单的方法是将目录挂载到 postgres 容器中,将文件放入挂载的目录中,并在那里引用它。

我们实际上是在挂载pgdata 目录,以确保即使我们重新创建 postgres docker 容器,postgres 数据仍然存在。所以,我的例子也将使用pgdata:

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

myfile.csv 放入&lt;path_to_local_pgdata&gt;(相对于包含配置或绝对路径的目录)。复制命令如下所示:

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

【讨论】:

local_pgdata 必须在主目录中? 如果是相对路径,那么local_pgdata必须是相对于主目录的,是的。 docker-compose.yml 应该是- "./local_pgdata:/var/lib/postgresql/data/pgdata" 谢谢你的帮助。 如果我的 CSV 文件在另一个容器中,如何将其放入 db 卷路径?【参考方案2】:

如果您在该容器中运行命令,则需要将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

【讨论】:

如何查看我的path_of_db_in_local_system 是什么? 您可以将其设置为您希望的任何内容(并且可以通过 docker 服务访问)。它将是存储在容器中的任何数据的路径(基本上是 django 应用程序执行的任何基于模型的操作在 postgres 上)将复制到本地系统,这样即使容器由于不可预见的情况而关闭,您的数据库也不会受到影响。 好的,但是我应该有两卷 - &lt;path_to_csv_in_local&gt;:&lt;path_of_csv_in_db_container&gt;&lt;path_of_db_in_local_system&gt;:/var/lib/postgresql/data 还是一样? 如果您要挂载数据目录路径(应始终挂载以避免丢失数据)则不需要,然后只需将该 excel 复制到该挂载的目录路径中,它将在容器中可用。假设您使用volumes: -/var/lib/postgres/:/var/lib/postgresql/data/pgdata,然后简单地将您的csv文件复制到/var/lib/postgres/,它将在/var/lib/postgresql/data/pgdata中可用。 ERROR: for django Cannot start service django: Mounts denied: The path /var/lib/postgres is not shared from OS X and is not known to Docker.

以上是关于如何设置路径以将 CSV 文件中的数据加载到 Docker 容器中的 PostgreSQL 数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spark 加载 JSON(保存在 csv 中的路径)?

如何解决 bash 脚本中的错误以将负载加载到 cpu 上?

在 Python 2.7 中运行 MySQL 以将 CSV 加载到 MySQL -

加载位于 H2 数据库的类路径中的 CSV 文件

如何设置 UWP C# StorageFile 以将 SoftwareBitmap 存储到特定路径

如何将 CSV 文件中的数据加载到 numpy 数组中[重复]