web-dev-qa-db-fra.com

Comment éditer des fichiers dans le conteneur docker arrêté / ne pas démarrer

En essayant de corriger les erreurs et les problèmes de débogage avec mon application qui est répartie sur plusieurs conteneurs, je modifie fréquemment des fichiers dans des conteneurs:

  • soit je suis totalement paresseux et installer nano et éditer directement dans le conteneur ou

  • Je docker cp le fichier hors du conteneur, le modifie, le recopie et redémarre le conteneur

Ce sont des étapes intermédiaires avant d’aboutir à un nouveau contenu pour la construction de conteneurs, ce qui prend beaucoup plus de temps que de faire ce qui précède (ce qui bien sûr n’est qu’intermédiaire/bidouille).

Maintenant, je casse fréquemment le programme de démarrage du conteneur, qui dans les cas de rupture est soit un script de noeud, soit un script de serveur web python), les deux échouant généralement à partir d’erreurs de syntaxe.

Y a-t-il un moyen de sauver ces conteneurs? Comme ils ne commencent pas, je ne peux pas exécuter de docker en eux, et ils sont donc perdus pour moi. Je vais ensuite la route rm/rmi/build/run après avoir corrigé le fichier incriminé dans l’entrée de construction.

Comment puis-je éditer des fichiers dans un conteneur arrêté, ou les copier ou démarrer un Shell dans un conteneur arrêté - tout ce qui me permet de réparer ce conteneur?

(Cela ressemble un peu à travailler sur un ordinateur distant et à casser la configuration réseau - la connexion est perdue "pour toujours" de cette façon et il faut utiliser une solution de secours, si celle-ci existe.)

Comment modifier les fichiers de conteneur Docker à partir de l'hôte? semble pertinent mais est obsolète.

59
Andreas Reiff

Répondant à ma propre question… espérant toujours une meilleure réponse d'une personne plus informée !!

Il y a 2 possibilités.

1) Modification directe du système de fichiers sur l'hôte . Ceci est quelque peu dangereux et risque de casser complètement le conteneur, éventuellement d'autres données en fonction de ce qui ne va pas.

2) Changer le script de démarrage en quelque chose qui n'échoue jamais, comme démarrer une bash, effectuer les corrections/modifications puis changer à nouveau le programme de démarrage pour celui souhaité (comme noeud ou quoi que ce soit avant).

Plus de détails:

1) Utilisation

docker ps

pour trouver les conteneurs en cours d'exécution ou

docker ps -a

trouver tous les conteneurs (y compris ceux arrêtés) et

docker inspect (containername)

recherchez le "Id", l'une des premières valeurs.

C’est la partie qui contient les détails de l’implémentation et qui peut changer. Sachez que vous risquez de perdre votre conteneur de cette façon.

Aller à

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

et vous y trouverez tous les fichiers modifiés en fonction de l'image sur laquelle le conteneur est basé. Vous pouvez écraser des fichiers, ajouter ou modifier des fichiers.

Encore une fois, je ne recommanderais pas cela.

2) Comme décrit à la section https://stackoverflow.com/a/32353134/586754 vous pouvez trouver la configuration json config.json sur un chemin tel que

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

Là, vous pouvez changer les arguments de e. g. "nodejs app.js" à "/ bin/bash". Maintenant, redémarrez le service Docker et démarrez le conteneur (vous devriez voir qu'il démarre maintenant correctement). Tu devrais utiliser

docker start -i (containername)

pour s’assurer qu’il n’arrête pas tout de suite. Vous pouvez maintenant travailler avec le conteneur et/ou attacher plus tard avec

docker exec -ti (containername) /bin/bash

De plus, docker cp est plutôt utile pour copier des fichiers qui ont été édités en dehors du conteneur.

De plus, on ne devrait avoir recours à ces mesures que si le conteneur est plus ou moins "perdu" de toute façon, tout changement constituerait une amélioration.

49
Andreas Reiff

J'ai eu un problème avec un conteneur qui ne voulait pas démarrer en raison d'un mauvais changement de configuration que j'ai effectué. J'ai pu copier le fichier hors du conteneur arrêté et le modifier. quelque chose comme:

docker cp docker_web_1:/etc/Apache2/sites-enabled/Apache2.conf .

(corrige le fichier)

docker cp Apache.conf docker_web_1:/etc/Apache2/sites-enabled/Apache2.conf
56
tomurie

Vous pouvez modifier le système de fichiers du conteneur directement, mais je ne sais pas si c'est une bonne idée. Vous devez d’abord trouver le chemin du répertoire utilisé comme racine d’exécution pour le conteneur. Courir docker container inspect id/name. Recherchez la clé UpperDir dans la sortie JSON.

C'est ton répertoire.

4
Tejas Sarade