Comment modifier un fichier après avoir shellé dans un conteneur Docker?

518

J'ai réussi à décortiquer un conteneur Docker en utilisant:

docker exec -i -t 69f1711a205e bash

Maintenant, je dois modifier le fichier et je n'ai aucun éditeur à l'intérieur:

root@69f1711a205e:/# nano
bash: nano: command not found
root@69f1711a205e:/# pico
bash: pico: command not found
root@69f1711a205e:/# vi
bash: vi: command not found
root@69f1711a205e:/# vim
bash: vim: command not found
root@69f1711a205e:/# emacs
bash: emacs: command not found
root@69f1711a205e:/#

Comment éditer des fichiers?

Igor Barinov
la source
@Opal J'utilise confluent / postgres-bw: 0,1
Igor Barinov
2
@Opal apt-get install vim fonctionne. Merci!
Igor Barinov
3
alors pourquoi ne pas créer la Dockerfilecommande install include-apt-get et générer votre propre conteneur? Le conteneur Docker est conçu comme ça, pas à votre façon.
BMW
1
docker devrait installer à bail sur l'éditeur de test, au moins vim par défaut
Bawantha

Réponses:

727

Comme dans les commentaires, il n'y a pas d'éditeur par défaut - étrange - la $EDITORvariable d'environnement est vide. Vous pouvez vous connecter à un conteneur avec:

docker exec -it <container> bash

Et courir:

apt-get update
apt-get install vim

Ou utilisez le Dockerfile suivant:

FROM  confluent/postgres-bw:0.1

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]

Les images Docker sont livrées découpées au strict minimum - donc aucun éditeur n'est installé avec le conteneur expédié. C'est pourquoi il est nécessaire de l'installer manuellement.

ÉDITER

Je vous encourage également à lire mon article sur le sujet.

Opale
la source
3
Ce dont vous avez besoin est de monter un volume: docs.docker.com/userguide/dockervolumes
Opal
16
J'avais besoin de me connecter en tant que root pour faire cela docker exec -u 0 -it container_name bash.
Eng.Fouad
34
Comme avec Docker, mieux vaut installer à la vim-tinyplace, probablement.
ryenus
2
Vous pourriez peut-être envisager de ne pas installer d'éditeur dans chaque conteneur auquel vous vous attachez, mais plutôt une seule fois sur la machine hôte docker. Comme d'autres commentateurs l'ont mentionné, vous pouvez monter le volume, vous pouvez donc modifier les fichiers qui vont être montés, ou naviguer vers les données du conteneur lui-même et modifier les fichiers dans/var/lib/docker/
Pitt
4
Je voulais juste changer une configuration de vrai à faux dans le conteneur. apt-getne fonctionnait pas en raison d'un problème d'autorisation à l'intérieur du conteneur, j'ai donc essayé sed -i 's/texttobechanged/textwanted/g' filename. Ça a marché pour moi.
Amreesh Tyagi
422

Si vous ne voulez pas ajouter un éditeur juste pour faire quelques petites modifications (par exemple, changer la configuration de Tomcat), vous pouvez simplement utiliser:

docker cp <container>:/path/to/file.ext .

qui le copie sur votre machine locale (dans votre répertoire actuel). Modifiez ensuite le fichier localement à l'aide de votre éditeur préféré, puis effectuez une

docker cp file.ext <container>:/path/to/file.ext

pour remplacer l'ancien fichier.

hkong
la source
21
@Igor Cela devrait en fait être la solution acceptée car c'est la bonne façon de le faire sans ajouter de packages supplémentaires à votre conteneur, tandis que l'ajout de packages devrait être une solution secondaire.
Routhinator
1
Pour les plates-formes Windows, vous pouvez utiliser, par exemple: docker cp <container>:C:\inetpub\wwwroot\Web.config .et docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares
1
Belle solution de contournement à des fins de test! Je ne recommande pas de le faire en production.
Michal Šípek
9
Et que recommandez-vous pour la production? Les utilisateurs devraient-ils modifier les fichiers d'un conteneur de manière interactive en cours de production?
lucid_dreamer
4
Il convient de noter que cette méthode modifie la propriété du fichier. Il est possible mais un peu fastidieux de le modifier par la suite en allant dans le conteneur en tant que root ( docker exec -u 0 -it mycontainer bash) puis en exécutant une chowncommande.
Steve Chambers
91

Vous pouvez l'utiliser cats'il est installé, ce qui sera probablement le cas s'il ne s'agit pas d'un conteneur nu / brut. Cela fonctionne dans un pincement, et ok quand copier + coller dans un éditeur approprié localement.

cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c / (better: ctrl-d)
cat file

cataffichera chaque ligne à la réception d'une nouvelle ligne. Assurez-vous d'ajouter une nouvelle ligne pour cette dernière ligne. ctrl-c envoie un SIGINTpour que cat se termine correctement. À partir des commentaires, vous voyez que vous pouvez également appuyer sur ctrl-d pour indiquer la fin du fichier ("plus aucune entrée à venir").

Une autre option est quelque chose comme infilterqui injecte un processus dans l'espace de noms du conteneur avec de la magie ptrace: https://github.com/yadutaf/infilter

meijsermans
la source
3
C'est tellement incroyablement utile s'il y a des problèmes de permission d'instillation!
Roman
17
ctrl+Dest mieux que ctrl+C. ctrl+Denvoie un EOF. Vous n'avez pas besoin d'ajouter une nouvelle ligne supplémentaire à la fin. Avec ctrl+C, si vous oubliez d'ajouter la nouvelle ligne, vous perdrez la dernière ligne!
wisbucky
1
@wisbucky Nice! Encore mieux. Pourrait avoir besoin de ctrl-d deux fois cependant.
meijsermans
52

Pour garder vos images Docker petites, n'installez pas d'éditeurs inutiles. Vous pouvez modifier les fichiers via SSH de l'hôte Docker vers le conteneur:

vim scp://remoteuser@containerip//path/to/document
Matthieu
la source
2
Je vous remercie. Je voulais laisser ce lien qui explique mieux le vim scp:// vim.wikia . De plus, pour obtenir l'adresse IP de votre conteneur, vous pouvez utilisersudo docker inspect <container_id> | grep "IPAddress"
aJetHorn
1
Je me demande simplement si j'utilise littéralement «remoteuser» ou «docker»? J'ai essayé: vim scp://[email protected]//data/gitea/conf/app.iniainsi que vim scp://[email protected]//data/gitea/conf/app.iniet les deux créent simplement un nouveau fichier vierge.
J. Scott Elblein
1
@ J.ScottElblein Cela nécessite d'abord la configuration sshsur votre conteneur Docker . Voir blog.softwaremill.com/… . Mais vous ne voulez généralement pas installer sshdans votre conteneur.
wisbucky
14

Parfois, vous devez d'abord exécuter le conteneur avec root:

docker exec -ti --user root <container-id> /bin/bash

Puis dans le conteneur, pour installer Vim ou autre chose:

apt-get install vim
yan
la source
7

J'utilise "docker run" (pas "docker exec"), et je suis dans une zone restreinte où nous ne pouvons pas installer d'éditeur. Mais j'ai un éditeur sur l'hôte Docker.

Ma solution de contournement est la suivante: Lier monter un volume de l'hôte Docker au conteneur ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) et modifier le fichier en dehors du conteneur. Cela ressemble à ceci:

docker run -v /outside/dir:/container/dir

C'est principalement pour expérimenter, et plus tard, je changerais le fichier lors de la construction de l'image.

ynux
la source
6

Après avoir lancé un shell sur le conteneur Docker, tapez simplement:

apt-get update
apt-get install nano
Dos
la source
6

Vous pouvez ouvrir un fichier existant avec

cat filename.extension

et copiez tout le texte existant dans le presse-papiers.

Supprimez ensuite l'ancien fichier avec

rm filename.extension

ou renommer l'ancien fichier avec

mv old-filename.extension new-filename.extension

Créez un nouveau fichier avec

cat > new-file.extension

Collez ensuite tout le texte copié dans le presse-papiers, appuyez sur Enteret quittez avec enregistrer en appuyant sur ctrl+z. Et voila pas besoin d'installer tout type d'éditeurs.

xD3ath
la source
5

Vous pouvez simplement modifier votre fichier sur l'hôte et le copier rapidement et l'exécuter à l'intérieur du conteneur. Voici mon raccourci d'une ligne pour copier et exécuter un fichier Python:

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py
David Dehghan
la source
1
Comment cela répond-il à la question? - "Comment éditer des fichiers?"
Peter Mortensen
4

Pour les opérations d'édition courantes, je préfère installer vi( vim-tiny ), qui utilise seulement 1491 ko ou nanoqui utilise 1707 ko .

En revanche, vimutilise 28,9 Mo .

Nous devons nous rappeler que pour apt-get installtravailler, nous devons faire updatela première fois, donc:

apt-get update
apt-get install vim-tiny

Pour démarrer l'éditeur dans CLI, nous devons entrer vi.

simhumileco
la source
2

Si vous utilisez un conteneur Windows et que vous souhaitez modifier n'importe quel fichier, vous pouvez obtenir et utiliser Vim dans la console Powershell facilement.

Pour décortiquer vers le conteneur Windows Docker avec PowerShell:

docker exec -it <name> powershell

  • Installez d'abord le gestionnaire de paquets Chocolatey

    Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;

  • Installer Vim

    choco install vim

  • Rafraîchir VARIABLE ENVIRONNEMENTALE Vous pouvez simplement exitrevenir au conteneur

  • Allez à l'emplacement du fichier et Vim it vim file.txt

Aidar Gatin
la source
1

C'est un peu visqueux, mais à la rigueur, vous pouvez utiliser sedou awkpour faire de petites modifications ou supprimer du texte. Soyez prudent avec vos cibles regex bien sûr et sachez que vous êtes probablement rootsur votre conteneur et que vous devrez peut-être réajuster les autorisations.

Par exemple, supprimer une ligne complète contenant du texte correspondant à une expression régulière:

awk '!/targetText/' file.txt > temp && mv temp file.txt

(Plus)

bbeecher
la source
1

Un moyen simple de modifier quelques lignes serait:

echo "deb http://deb.debian.org/debian stretch main" > sources.list
Saubhagya Srivastava
la source
1

Voir Stack Overflow question sed modifier le fichier en place

Ce serait une bonne option ici, si:

  1. Pour modifier un gros fichier, il est impossible de l'utiliser cat.
  2. Installer Vim n'est pas autorisé ou prend trop de temps. Ma situation utilise l'image MySQL 5.7 quand je veux changer le my.cnffichier, il n'y a pas vim, viet installer Vim prend trop de temps (China Great Firewall). sedest fourni dans l'image, et c'est assez simple. Mon utilisation est comme

    sed -i /s/testtobechanged/textwanted/g filename

    Utilisez man sedou recherchez d'autres didacticiels pour une utilisation plus complexe.

Shihe Zhang
la source
1

Vous pouvez utiliser catsi installé, avec le >caractère. Voici la manipulation:

cat > file_to_edit
#1 Write or Paste you text
#2 don't forget to leave a blank line at the end of file
#3 Ctrl + C to apply configuration

Vous pouvez maintenant voir le résultat avec la commande

cat file
dero
la source
0

Vous pouvez également utiliser un conteneur spécial qui ne contiendra que la commande dont vous avez besoin: Vim. J'ai choisi python-vim . Il suppose que les données que vous souhaitez modifier se trouvent dans un conteneur de données construit avec le Dockerfile suivant:

FROM debian:jessie
ENV MY_USER_PASS my_user_pass
RUN groupadd --gid 1001 my_user
RUN useradd -ms /bin/bash --home /home/my_user \
            -p $(echo "print crypt("${MY_USER_PASS:-password}", "salt")" | perl) \
            --uid 1001 --gid 1001 my_user
ADD src /home/my_user/src
RUN chown -R my_user:my_user /home/my_user/src
RUN chmod u+x /home/my_user/src
CMD ["true"]

Vous pourrez modifier vos données en montant un volume Docker (src_volume) qui sera partagé par votre conteneur de données (src_data) et le conteneur python-vim.

docker volume create --name src_volume
docker build -t src_data .
docker run -d -v src_volume:/home/my_user/src --name src_data_1 src_data
docker run --rm -it -v src_volume:/src fedeg/python-vim:latest

De cette façon, vous ne changez pas vos conteneurs. Vous utilisez simplement un conteneur spécial pour ce travail.

MaxiReglisse
la source