No estoy seguro de si esto es posible o si estoy haciendo algo mal, ya que todavía soy bastante nuevo en Docker. Básicamente, quiero exportar el resultado de una consulta dentro del contenedor acoplable de PostgreSQL como un archivo csv a mi máquina local.
Aquí es donde llegué hasta ahora. En primer lugar, ejecuto mi contenedor docker de PostgreSQL con este comando:
sudo docker run --rm --name pg-docker -e POSTGRES_PASSWORD=something -d -p 5432:5432 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres
Luego accedo al contenedor docker con docker exec para ejecutar el comando PostgreSQL que copiaría el resultado de la consulta en un archivo csv con una ubicación específica como esta:
\copy (select id,value from test) to 'test_1.csv' with csv;
Pensé que debería exportar el resultado de la consulta como un archivo csv llamado test_1.csv en la máquina local, pero no pude encontrar el archivo en ninguna parte de mi máquina local, también revisé estos dos directorios: $HOME/docker/volumes/postgres
; /var/lib/postgresql/data postgres
Puede exportar los datos a STDOUT
y canalizar el resultado a un archivo en la máquina cliente:
docker exec -it -u database_user_name container_name \ psql -d database_name -c "COPY (SELECT * FROM table) TO STDOUT CSV" > output.csv
-c
le dice a psql que ejecute una instrucción SQL determinada cuando se establezca la conexión.
Entonces su comando debería verse así:
docker exec -it -u postgres pgdocker \ psql -d yourdb -c "COPY (SELECT * FROM test) TO STDOUT CSV" > test_1.csv
El directorio /var/lib/postgresql/data
es donde el servidor de la base de datos almacena sus archivos de datos. No es un directorio que los usuarios necesiten manipular directamente o donde no se pueda encontrar nada interesante.
Las rutas como test_1.csv
son relativas al directorio de trabajo. El directorio predeterminado cuando ingresa al contenedor de postgres con docker exec
es /
, por lo que es donde debe estar su archivo. También puede cambiar a otro directorio con cd
antes de ejecutar psql
:
root@b9e5a0572207:/some/other/path# cd /some/other/path/ root@b9e5a0572207:/some/other/path# psql -U postgres
... o puede proporcionar una ruta absoluta:
\copy (select id,value from test) to '/some/other/path/test_1.csv' with csv;
Puede usar docker cp
para transferir un archivo desde el contenedor al host:
docker cp pg-docker:/some/other/path/test_1.csv /tmp
... o puede crear un volumen si esto es algo que hace con frecuencia.