Bash / Docker exec: redirección de archivos desde el interior de un contenedor


No puedo averiguar cómo leer el contenido de un archivo desde un contenedor Docker. Quiero ejecutar el contenido de un archivo SQL en mi contenedor PGSQL. Lo intenté:

docker exec -it app_pgsql psql --host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql

Mi aplicación está montada en /usr/src/app. Pero tengo un error:

Bash: /usr/src/app/migrations/*.sql: No hay tal archivo o directorio

Parece que Bash interpreta esta ruta como una ruta host, no como una ruta guest. De hecho, ejecutar el comando en dos veces funciona perfectamente:

docker exec -it app_pgsql
psql --host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql

Creo que eso es más un problema de Bash que uno de Docker, pero todavía estoy atascado! :)

 25
Author: Jonathan Petitcolas, 2015-07-15

3 answers

Intenta usar un shell para ejecutar ese comando

sh -c 'psql --host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql'

El comando completo sería:

docker exec -it app_pgsql sh -c 'psql --host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql'
 30
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-05 09:16:41

Intenta con sh -c "your long command"

 13
Author: user2915097,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-15 18:29:12

Puede usar el cliente de base de datos para conectarse a su contenedor y redirigir el archivo de base de datos, luego puede realizar la restauración.

Aquí hay un ejemplo con MySQL: un contenedor que ejecuta MySQL, usando la pila de red host. Dado que el contenedor está utilizando la pila de red host (si no tiene ninguna restricción en su MySQL o cualquier base de datos), puede conectarse a través de localhost y realizar los comandos de forma transparente

mysql -h 127.0.0.1 -u user -pyour_passwd database_name < db_backup.sql

Usted puede hacer lo mismo con PostgresSQL (Restaurar un archivo de copia de seguridad de postgres usando la línea de comandos?):

pg_restore --host 127.0.0.1 --port 5432 --username "postgres" --dbname "mydatabase" --no-password --clean "/home/dinesh/db/mydb.backup"

Parece que "docker exec" no soporta redirección de entrada.. Voy a verificar esto y tal vez abrir un problema para la Comunidad Docker en GitHub, si es aplicable.

 1
Author: ivanleoncz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:05