Comment modifier des fichiers dans un conteneur Docker arrêté/ne pas démarrer

essayer de corriger des erreurs et de déboguer des problèmes avec mon application qui est divisé en plusieurs conteneurs, Je édite fréquemment des fichiers dans les conteneurs:

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

  • je docker cp le fichier du conteneur, de l'éditer, de copier et de redémarrer le conteneur

ce sont étapes intermédiaires avant d'arriver au nouveau contenu pour la construction du conteneur, ce qui prend beaucoup plus de temps que de faire ce qui précède (ce qui est bien sûr seulement intermédiaire/bidouillage autour).

maintenant je casse fréquemment le programme de départ du conteneur, qui dans les cas de rupture est soit un script de noeud ou un script Python webserver, les deux échouent typiquement d'erreurs de syntaxe.

Est-il un moyen de sauver ces conteneurs? Puisqu'ils ne commencent pas, Je ne peux pas docker exec en eux, et ainsi, ils sont perdus pour moi. Je passe ensuite la route rm/rmi/build/run après avoir corrigé le fichier fautif dans l'entrée build.

Comment puis - je éditer des fichiers dans un conteneur arrêté, ou les cp dans ou démarrer un shell dans un conteneur arrêté-tout ce qui me permet de fixer ce conteneur?

(il semble un peu comme travailler sur un ordinateur distant et briser la configuration du réseau-la connexion est perdue "pour toujours" de cette façon et on doit utiliser un repli, si cela existe.)

comment modifier les fichiers Docker container à partir de l'hôte? semble pertinent mais est dépassé.

39
demandé sur Community 2015-09-24 01:51:39

3 réponses

répondant à ma propre question.. j'espère toujours une meilleure réponse de la part d'une personne plus expérimentée!!

il y a 2 possibilités.

1) édition du système de fichiers sur l'hôte directement . C'est quelque peu dangereux et a une chance de casser complètement le conteneur, peut-être d'autres données en fonction de ce qui va mal.

2) changer le script de démarrage en quelque chose qui ne échoue jamais comme démarrer une bash, faire les corrections / modifications et ensuite changer le programme de démarrage à nouveau à celui désiré (comme le noeud ou ce qu'il était avant).

plus de détails:

1) en utilisant

docker ps

pour trouver les conteneurs en marche ou

docker ps -a

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

docker inspect (containername)

cherche le "Id", un de la première des valeurs.

C'est la partie qui contient des détails d'implémentation et qui pourrait changer, soyez conscient que vous pourriez perdre votre conteneur de cette façon.

Aller à

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

et là vous trouverez tous les fichiers qui sont modifiés vers l'image, le conteneur est basé. Vous pouvez écraser des fichiers, Ajouter ou modifier des fichiers.

encore une fois, je ne le recommande pas.

2) comme décrit à https://stackoverflow.com/a/32353134/586754 vous pouvez trouver la configuration JSON config.json à un chemin comme

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

là vous pouvez changer l'args de E. G. " nodejs app.js" de "/bin/bash". Redémarrez maintenant le service docker et démarrez le conteneur (vous devriez voir qu'il démarre maintenant correctement). Vous devez 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 plus tard joindre avec

docker exec -ti (containername) /bin/bash

aussi, docker cp est plutôt utile pour copier des fichiers qui ont été édités à l'extérieur du conteneur.

aussi, on ne devrait revenir à ces mesures que si le conteneur est plus ou moins" perdu " de toute façon, de sorte que tout changement serait une amélioration.

43
répondu Andreas Reiff 2017-05-23 11:47:01

j'ai eu un problème avec un conteneur qui ne démarrait pas à cause d'un mauvais changement de configuration que j'ai fait. J'ai pu copier le fichier du conteneur arrêté et l'éditer. quelque chose comme:

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

(corriger le fichier)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf
21
répondu tomurie 2018-05-04 02:33:20

vous pouvez éditer le système de fichiers conteneur directement, mais je ne sais pas si c'est une bonne idée. Tout d'abord, vous devez trouver le chemin du répertoire qui est utilisé comme root runtime pour container. Lancez docker container inspect id/name . Recherchez la clé UpperDir dans la sortie JSON.

C'est votre répertoire.

2
répondu Tejas Sarade 2018-06-10 14:27:02