如何设置路径以将 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
在哪个容器中,django
或 db
?您正在执行哪个容器? django
或 db
?
@Alasdair myfile.csv
位于主目录中,其中也是 Django 项目的 docker-compose.yml
和 Dockerfile
。我在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
放入<path_to_local_pgdata>
(相对于包含配置或绝对路径的目录)。复制命令如下所示:
\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 上)将复制到本地系统,这样即使容器由于不可预见的情况而关闭,您的数据库也不会受到影响。
好的,但是我应该有两卷 - <path_to_csv_in_local>:<path_of_csv_in_db_container>
和 <path_of_db_in_local_system>:/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 -