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?
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.
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.
J'utilise le plugin sftp de mon IDE.
Exemple utilisant le plugin sftp sublime: https://www.youtube.com/watch?v=HMfjt_YMru0
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.
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
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 ...)?
Exemple:
docker run -d --name shared_vim_editor \
-v <your_volume>:/home/developer/workspace \
jare/vim-bundle:latest
docker exec -it -u root shared_vim_editor /bin/bash
J'espère que cela t'aides.
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