Как правильно скопировать данные в базу данных postgres через docker через COPY? - PullRequest
0 голосов
/ 22 марта 2020

Я хочу запустить контейнер postgresql docker для хранения некоторых данных. Ранее я использовал docker для clickhouse, но не для postgresql, и у меня возникла небольшая проблема c, которая заключается в загрузке данных с помощью COPY. Вот подробности:

os: UBUNTU 16.04 работает на NU C

с использованием 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

Я хочу скопировать файл, который в данный момент находится в том же NU C в следующей папке:

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:~$ 

Я знаю, что здесь что-то есть c, я могу не оборачивайся. Как бы я go правильно запустил это? Я предполагаю, что я делаю ошибку с путем? Цените помощь, ребята.

Ответы [ 3 ]

1 голос
/ 22 марта 2020

Вам следует установить пакет 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 ГБ.)

0 голосов
/ 23 марта 2020

Итак, после комбинации предложений это то, что сработало для меня:

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 и docker имя пользователя из файла docker в документации docker.

0 голосов
/ 22 марта 2020

Я знаю, что здесь что-то есть ... 1006 * Возможно, я не оборачиваюсь головой.

Действительно. Имя файла должно быть в одинарных кавычках (или долларовых кавычках), а не в двойных кавычках. Могут быть и более поздние ошибки, но вы должны исправить это, чтобы добраться до них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...