web-dev-qa-db-fra.com

Comment modifier les fichiers de conteneur Docker à partir de l'hôte?

Maintenant que j'ai trouvé un moyen d'exposer les fichiers de l'hôte au conteneur (option -v), j'aimerais faire le contraire: 

Comment éditer des fichiers d'un conteneur en cours d'exécution avec un éditeur d'hôte?

sshfs pourrait probablement faire le travail, mais comme un conteneur en cours d’exécution est déjà une sorte de répertoire hôte, je me demande s’il existe un moyen portable (entre aufs, btrfs et device mapper) de le faire?

41
ascobol

Bien que cela soit possible et que les autres réponses expliquent comment, vous devriez éviter si possible de modifier des fichiers dans le système de fichiers Union.

Votre définition des volumes n’est pas tout à fait correcte: il s’agit plus de contourner le système de fichiers Union que d’exposer des fichiers sur l’hôte. Par exemple, si je le fais:

$ docker run --name="test" -v /volume-test debian echo "test"

Le répertoire /volume-test à l'intérieur du conteneur ne fera pas partie du système de fichiers Union mais existera plutôt quelque part sur l'hôte. Je n'ai pas précisé où sur l'hôte, car je ne m'en soucie peut-être pas: je n'expose pas les fichiers de l'hôte, je crée simplement un répertoire pouvant être partagé entre les conteneurs et l'hôte. Vous pouvez savoir exactement où il se trouve sur l'hôte avec:

$ docker inspect -f "{{.Volumes}}" test
map[/volume_test:/var/lib/docker/vfs/dir/b7fff1922e25f0df949e650dfa885dbc304d9d213f703250cf5857446d104895]

Si vous avez vraiment besoin de modifier rapidement un fichier pour tester quelque chose, utilisez soit docker exec pour obtenir un shell dans le conteneur et modifiez-le directement, soit utilisez docker cp pour copier le fichier, éditer sur l'hôte et le copier à nouveau.

21
Adrian Mouat

Le meilleur moyen est:

  $ docker cp CONTAINER:FILEPATH LOCALFILEPATH
  $ vi LOCALFILEPATH
  $ docker cp LOCALFILEPATH CONTAINER:FILEPATH

Limitations avec $ docker exec: il ne peut être attaché qu’à un conteneur en cours d’exécution.

Limitations avec $ docker run: cela créera un nouveau conteneur.

20
zhigang

J'utilise le plugin sftp de mon IDE.

  1. Installez le serveur ssh pour votre conteneur et autorisez les accès root.
  2. Exécutez votre conteneur Docker avec -p localport: 22
  3. Installer depuis votre IDE un plugin sftp

Exemple utilisant le plugin sftp sublime: https://www.youtube.com/watch?v=HMfjt_YMru0

2
moylop260

Nous pouvons utiliser un autre moyen pour éditer des fichiers dans des conteneurs de travail (cela ne fonctionnera pas si le conteneur est arrêté). 

La logique consiste à:
-) copier le fichier du conteneur vers l'hôte
-) éditer le fichier sur l'hôte en utilisant son éditeur d'hôte
-) copie le fichier dans le conteneur

Nous pouvons faire toutes ces étapes manuellement, mais j’ai écrit un script bash simple pour rendre cela facile par un seul appel.

/bin/dmcedit:

#!/bin/sh
set -e

CONTAINER=$1
FILEPATH=$2
BASE=$(basename $FILEPATH)
DIR=$(dirname $FILEPATH)
TMPDIR=/tmp/m_docker_$(date +%s)/

mkdir $TMPDIR
cd $TMPDIR
docker cp $CONTAINER:$FILEPATH ./$DIR
mcedit ./$FILEPATH
docker cp ./$FILEPATH $CONTAINER:$FILEPATH
rm -rf $TMPDIR

echo 'END'
exit 1;

Exemple d'utilisation:

dmcedit CONTAINERNAME/chemin/vers/fichier/dans/conteneur

Le script est très facile, mais cela fonctionne bien pour moi.

Toutes les suggestions sont appréciées.

1
Mikl

Voici le script que j'utilise:

#!/bin/bash
IFS=$'\n\t'
set -euox pipefail


CNAME="$1"
FILE_PATH="$2"

TMPFILE="$(mktemp)"
docker exec "$CNAME" cat "$FILE_PATH" > "$TMPFILE"
$EDITOR "$TMPFILE"
cat "$TMPFILE" | docker exec -i "$CNAME" sh -c 'cat > '"$FILE_PATH"
rm "$TMPFILE"

et le Gist pour quand je le répare mais oublie de mettre à jour cette réponse: https://Gist.github.com/dmohs/b50ea4302b62ebfc4f308a20d3de4213

1
DavidM

Si vous pensez que votre volume est un "lecteur réseau", ce sera plus facile . Pour éditer le fichier situé dans ce lecteur, vous devez simplement allumer un autre ordinateur et vous connecter à ce lecteur réseau, puis éditer le fichier comme d'habitude .

Comment faire cela uniquement avec docker (sans FTP/SSH ...)?

  1. Exécutez un conteneur doté d'un éditeur (VI, Emacs). Rechercher dans le hub Docker pour "Alpine vim"

Exemple: 

docker run -d --name shared_vim_editor \
 -v <your_volume>:/home/developer/workspace \
jare/vim-bundle:latest
  1. Exécutez la commande interactive: 

docker exec -it -u root shared_vim_editor /bin/bash 

J'espère que cela t'aides.

0
Brian Ng

Ce que je fais, c'est utiliser Emacs avec le paquetage docker installé. Je recommanderais Spacemacs version d'Emacs. Je voudrais suivre les étapes suivantes:

1) Installez Emacs ( Instruction ) et installez Spacemacs ( Instruction )

2) Ajoutez docker dans votre fichier .spacemacs

3) Démarrer Emacs

4) Recherchez le fichier (SPC+f+f) et tapez /docker:<container-id>:/<path of dir/file in the container>

5) Maintenant, votre emacs utilisera l'environnement conteneur pour éditer les fichiers

0
TheRimalaya