我希望运行postgresql docker容器来保存一些数据。我以前在clickhouse中使用过docker,但没有在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中运行以下代码。方法1:
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:~$ 我知道这里有一些基本的东西,我可能不是在胡思乱想。我该如何正确地运行它呢?我想我是不是弄错了路径?感谢你们的帮助。
发布于 2020-03-23 23:52:47
因此,在综合了几个建议之后,以下是对我有效的建议:
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用户名。
发布于 2020-03-23 03:00:22
您应该在主机上安装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的数据文件来说,这可能是一个很大的问题。)
发布于 2020-03-23 03:10:27
我知道这里有一些基本的东西,我可能不是在胡思乱想。
确实如此。文件名需要用单引号(或美元引号),而不能用双引号。以后可能也会出现错误,但您必须修复此错误才能获得这些错误。
https://stackoverflow.com/questions/60802668
复制相似问题