web-dev-qa-db-fra.com

Bash / Docker exec: redirection de fichiers depuis l'intérieur d'un conteneur

Je ne peux pas comprendre comment lire le contenu d'un fichier à partir d'un conteneur Docker. Je veux exécuter le contenu d'un fichier SQL dans mon conteneur PGSQL. J'ai essayé:

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

Mon application est montée dans /usr/src/app. Mais j'ai une erreur:

bash: /usr/src/app/migrations/*.sql: aucun fichier ou répertoire de ce type

Il semble que Bash interprète ce chemin comme un chemin d'hôte, pas un chemin invité. En effet, l'exécution de la commande en deux temps fonctionne parfaitement:

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

Je pense que c'est plus un problème Bash qu'un problème Docker, mais je suis toujours bloqué! :)

27
Jonathan Petitcolas

Essayez d'utiliser un shell pour exécuter cette commande

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

La commande complète serait:

docker exec -it app_pgsql sh -c 'psql --Host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql'
33
VonC

essayez avec sh -c "your long command"

14
user2915097

Vous pouvez utiliser le client de base de données pour vous connecter à votre conteneur et rediriger le fichier de base de données, puis vous pouvez effectuer la restauration.

Voici un exemple avec MySQL : un conteneur exécutant MySQL, utilisant la pile réseau Host. Étant donné que le conteneur utilise la pile du réseau hôte (si vous n'avez aucune restriction sur votre base de données MySQL ou autre), vous pouvez vous connecter via localhost et exécuter les commandes de manière transparente

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

Vous pouvez faire de même avec PostgresSQL ( Restaurer un fichier de sauvegarde postgres en utilisant la ligne de commande? ):

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

On dirait que "docker exec" ne prend pas en charge la redirection d'entrée .. Je vais vérifier cela et peut-être ouvrir un problème pour Docker Community sur GitHub, si cela est applicable.

1
ivanleoncz