【问题标题】:How to properly copy data into postgres database through docker via COPY?如何通过 COPY 通过 docker 将数据正确复制到 postgres 数据库中?
【发布时间】:2020-03-23 23:52:47
【问题描述】:

我希望运行一个 postgresql docker 容器来保存一些数据。我之前将 docker 用于 clickhouse,但没有用于 postgresql,我在这里遇到了一些基本问题,即使用 COPY 加载数据。以下是详细信息:

操作系统:在 NUC 上运行的 UBUNTU 16.04

从这里使用 docker postgres 服务器容器:

https://docs.docker.com/engine/examples/postgresql_service/

docker ps 显示服务器运行没问题:

29fb9b39e293        eg_postgresql                     "/usr/lib/postgresql…"   43 hours ago        Up 3 hours              0.0.0.0:5432->5432/tcp   pg_test

我想复制当前位于以下文件夹中同一 NUC 中的文件:

Desktop/ems/ems_raw.csv

我已将用户权限授予 postgres 用户以防万一:

-rw-rw-r-- 1 postgres me 4049497429 Mar 22 12:17 Desktop/ems/ems_raw.csv
me@docker1:~$ 

我尝试在 psql 中运行以下命令。方法一:

me@docker1:~$ docker exec -ti pg_test psql -U postgres
psql (9.3.17)
Type "help" for help.

postgres=# COPY ems_stage FROM "Desktop/ems/ems_raw.csv" WITH (format csv,header);
ERROR:  syntax error at or near ""Desktop/ems/ems_raw.csv""
LINE 1: COPY ems_stage FROM "Desktop/ems/ems_raw.csv" WITH (format c...
                            ^
postgres=# 

我也尝试通过终端直接运行它以防万一,方法 2:

me@docker1:~$ docker exec -ti pg_test psql -U postgres -c "COPY ems_stage FROM "Desktop/ems/ems_raw.csv" WITH (format csv,header);"
ERROR:  syntax error at or near "Desktop"
LINE 1: COPY ems_stage FROM Desktop/ems/ems_raw.csv WITH (format csv...
                            ^
me@docker1:~$ 

我知道这里有一些基本的东西我可能无法理解。我将如何正确运行它?我假设我在路径上犯了错误?感谢大家的帮助。

【问题讨论】:

标签: postgresql docker


【解决方案1】:

所以在综合建议后,这对我有用:

psql -h localhost -p 5432 -d docker -U docker --password --c "\COPY ems_stage FROM 'Desktop/ems/ems_raw.csv' WITH (format csv,header);"

从 docker 文档中的 dockerfile 引用 docker 数据库和 docker 用户名。

【讨论】:

    【解决方案2】:

    你应该在你的主机上安装postgresql-client 包(如果你还没有的话),然后使用psql 从那里连接到数据库

    host$ sql -h localhost -U postgres
    

    连接后,如上所述运行COPY FROM ... 命令。

    在这种情况下,将 Docker 容器视为远程系统会有所帮助,docker exec 命令等同于ssh root@...。容器有一个隔离的文件系统,看不到主机上的文件;因为在这种情况下你是从容器内部启动psql,所以COPY 看不到它试图复制的文件。

    原则上,您可以使用docker run -v 选项将目录从主机挂载到容器中。由于您使用的是本机 Linux,因此可以在安装了外部数据文件的情况下启动数据库,如您所示运行 COPY FROM ...,然后在没有它的情况下重新启动数据库。不过,为此重新启动数据库似乎不是一个理想的路径。 (在其他主机配置上,绑定挂载可能非常慢,这对于 4 GB 数据文件来说可能是个大问题。)

    【讨论】:

      【解决方案3】:

      我知道这里有一些基本的东西我可能无法理解。

      确实如此。文件名需要用单引号(或美元引号),而不是双引号。以后也可能会出现错误,但您必须解决此问题才能解决这些错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 2018-10-02
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多