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?
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.
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.
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
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
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
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.
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
Une fois que vous avez ouvert le conteneur Docker, tapez simplement:
apt-get update
apt-get install nano
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
.
Voir la question relative au débordement de pile Le fichier d’édition modifié est en place
Ce serait une bonne option ici si:
cat
.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.
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
Un moyen facile d’éditer quelques lignes serait:
echo "deb http://deb.debian.org/debian stretch main" > sources.list
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.
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