web-dev-qa-db-fra.com

Comment puis-je éditer un fichier après avoir Shell dans un conteneur Docker?

J'ai réussi à piler un conteneur Docker à l'aide de

docker exec -i -t 69f1711a205e bash

Maintenant, je dois éditer 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?

364
Igor Barinov

Comme dans les commentaires, il n'y a pas d'éditeur défini par défaut - étrange - la variable d'environnement $EDITOR 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 fichier 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 - aucun éditeur n’est donc installé avec le conteneur livré. C'est pourquoi il est nécessaire de l'installer manuellement.

MODIFIER

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

534
Opal

Si vous ne souhaitez pas ajouter un éditeur uniquement pour apporter quelques modifications mineures (par exemple, modifier 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). Ensuite, éditez le fichier localement en utilisant votre éditeur favori, puis effectuez une

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

pour remplacer l'ancien fichier.

307
hkong

Vous pouvez utiliser cat s'il est installé, ce qui sera probablement le cas s'il ne s'agit pas d'un conteneur nu/brut. Cela fonctionne à la pincée, 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
cat file

cat affichera chaque ligne lors de la réception d'une nouvelle ligne. Assurez-vous d'ajouter une nouvelle ligne pour cette dernière ligne. ctrl-c envoie une variable SIGINT à cat pour qu’elle se termine normalement.

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

59
meijsermans

Pour que vos images Docker restent petites, n'installez pas d'éditeurs inutiles. Vous pouvez éditer les fichiers sur SSH à partir de l'hôte Docker vers le conteneur:

vim scp://remoteuser@containerip//path/to/document
43
Matthew

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

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

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

apt-get install vim
10
yan

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 consiste à: lier un volume de l'hôte Docker au conteneur ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) et modifier le fichier à l'extérieur le conteneur. Cela ressemble à ceci:

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

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

6
ynux

Vous pouvez simplement éditer votre fichier sur l'hôte, 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
5
David Dehghan

Une fois que vous avez ouvert le conteneur Docker, tapez simplement:

apt-get update
apt-get install nano
2
Dos

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

D'autre part, vim utilise 28,9 Mo.

Nous devons nous rappeler que pour que apt-get install fonctionne, nous devons faire la update la première fois, donc:

apt-get update
apt-get install vim-tiny

Pour démarrer l'éditeur en CLI, vous devez entrer vi.

2
simhumileco

Voir la question relative au débordement de pile Le fichier d’édition modifié est en place

Ce serait une bonne option ici si:

  1. Pour modifier un fichier volumineux, il est impossible d'utiliser cat.
  2. L'installation de Vim n'est pas autorisée ou prend trop de temps ..___ Ma situation utilise l'image de MySQL 5.7 lorsque je veux modifier le fichier my.cnf, il n'y a pas de vim, vi et l'installation de Vim prend trop de temps (China Great Firewall). sed est fourni dans l'image, et c'est assez simple. Mon usage est comme

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

    Utilisez man sed ou recherchez d'autres tutoriels pour une utilisation plus complexe.

1
Shihe Zhang

C'est un peu vicieux, mais vous pouvez utiliser sed ou awk pour effectuer de petites modifications ou supprimer du texte. Bien sûr, soyez prudent avec vos cibles regex et sachez que vous êtes probablement root sur votre conteneur et que vous devrez peut-être modifier 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)

1
bbeecher

Un moyen facile d’éditer quelques lignes serait:

echo "deb http://deb.debian.org/debian stretch main" > sources.list
1

Vous pouvez également utiliser un conteneur spécial qui ne contiendra que la commande dont vous avez besoin: Vim. J'ai choisi python-vim . Cela suppose que les données que vous souhaitez modifier se trouvent dans un conteneur de données créé avec le fichier Docker 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 éditer 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.

0
MaxiReglisse

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

Pour shell dans le conteneur Windows Docker avec PowerShell:

docker exec -it <name> powershell

  • Première installation du gestionnaire de paquets Chocolatey

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

  • Installer Vim

    choco install vim

  • Actualiser ENVIRONNEMENTAL VARIABLE Vous pouvez simplement exit et Shell revenir au conteneur

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

0
Aidar Gatin