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?
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).
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.
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