web-dev-qa-db-fra.com

Docker exec - Écrire du texte dans un fichier dans un conteneur

Je veux écrire une ligne de texte dans un fichier texte À L'INTÉRIEUR d'un conteneur Docker en cours d'exécution. Voici ce que j'ai essayé jusqu'à présent:

docker exec -d app_$i eval echo "server.url=$server_url" >> /home/app/.app/app.config

Réponse:

/home/user/.app/app.config: No such file or directory

Deuxième essai:

cfg_add="echo 'server.url=$server_url' >> /home/user/.app/app.config"
docker exec -i app_$i eval $cfg_add

Réponse:

exec: "eval": executable file not found in $PATH

Des idées?

15
jwi

eval est un shell intégré , tandis que docker exec nécessite un utilitaire externe pour être appelé, donc utiliser eval n'est pas pas une option.

Au lieu de cela, appelez un exécutable Shell dans le conteneur (bash) explicitement , et passez-lui la commande à exécuter en tant que chaîne , via son -c option:

docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config"

En utilisant une chaîne entre guillemets pour passer à bash -c, vous vous assurez que le shell courant exécute d'abord l'interpolation de chaîne, tandis que l'instance bash du conteneur voit ensuite le résultat développé comme un littéral , dans le cadre de la chaîne incorporée entre guillemets simples .


Quant à vos symptômes:

  • /home/user/.app/app.config: No such file or directory a été signalé, car la redirection que vous souhaitiez effectuer dans le conteneur s'est effectivement produite dans le shell de votre hôte - et parce que dir. /home/user/.app n'existe apparemment pas dans le système de fichiers de votre hôte, la commande a échoué fondamentalement , avant le shell de votre hôte a même tenté d'exécuter la commande (bash annulera l'exécution de la commande si une redirection de sortie ne peut pas être effectuée).

    • Ainsi, même si votre première commande contenait également eval, son utilisation n'est apparue comme un problème que lors de votre deuxième commande, qui en fait se faire exécuter.
  • exec: "eval": executable file not found in $PATH s'est produit, car, comme indiqué, eval n'est pas un utilitaire externe , mais un Shell intégré et docker exec ne peut exécuter que des utilitaires externes.

39
mklement0

Aditionellement:

Si vous devez écrire du texte depuis l'extérieur du conteneur, cela fonctionne également:

(docker exec -i container sh -c "cat > c.sql") < c.sql

Cela vous dirigera vers le conteneur. Bien sûr, cela fonctionnerait également pour le texte brut (pas de fichier). Il est important de laisser le -t paramètre.

Voir https://github.com/docker/docker/pull/9537

MISE À JOUR (au cas où vous auriez juste besoin de copier des fichiers, pas des parties de fichiers):

Docker v17.03 a docker cp qui copie entre le fs local et le conteneur: https://docs.docker.com/engine/reference/commandline/cp/#usage

11
Risadinha