Comment puis-je append un volume à un conteneur Docker existant?

J’ai un conteneur Docker que j’ai créé simplement en installant Docker sur Ubuntu et en faisant:

sudo docker run -i -t ubuntu /bin/bash 

J’ai immédiatement commencé à installer Java et d’autres outils, à passer du temps avec lui et à arrêter le conteneur en

 exit 

Ensuite, j’ai voulu append un volume et réalisé que ce n’est pas aussi simple que je le pensais. Si j’utilise sudo docker -v /somedir run ... alors je me retrouve avec un nouveau conteneur, donc j’aurais installer Java et faire ce que j’ai déjà fait pour arriver à un conteneur avec un volume monté.

Toute la documentation sur le assembly d’un dossier à partir de l’hôte semble impliquer que le assembly d’un volume peut être effectué lors de la création d’un conteneur. Donc, la seule option que je dois éviter de reconfigurer un nouveau conteneur à partir de zéro est de valider le conteneur existant dans un référentiel et de l’utiliser comme base d’un nouveau conteneur tout en montant le volume.

Est-ce bien le seul moyen d’append un volume à un conteneur existant?

Vous pouvez valider votre conteneur existant (c’est-à-dire créer une nouvelle image à partir des modifications du conteneur), puis l’exécuter avec vos nouveaux supports.

Exemple:

 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5a8f89adeead ubuntu:14.04 "/bin/bash" About a minute ago Exited (0) About a minute ago agitated_newton $ docker commit 5a8f89adeead newimagename $ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash 

Si tout est correct, arrêtez votre ancien conteneur et utilisez-en un nouveau.

C’est tout 🙂

Nous n’avons aucun moyen d’append du volume dans le conteneur en cours d’exécution, mais pour atteindre cet objective, vous pouvez utiliser les commandes ci-dessous:

Copier des fichiers / dossiers entre un conteneur et le système de fichiers local: –

 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH 

Pour référence voir:

https://docs.docker.com/engine/reference/commandline/cp/

Jérôme Petazzoni a un article de blog assez intéressant sur la façon d’ attacher un volume à un conteneur pendant qu’il est en cours d’exécution . Ce n’est pas quelque chose qui est intégré à Docker, mais qu’il est possible d’accomplir.

Comme il le fait remarquer

Cela ne fonctionnera pas sur les systèmes de fichiers qui ne sont pas basés sur des périphériques de blocs.

Cela ne fonctionnera que si / proc / mounts indique correctement le nœud de périphérique de bloc (ce qui, comme nous l’avons vu ci-dessus, n’est pas nécessairement vrai).

De plus, je l’ai seulement testé sur mon environnement local; Je n’ai même pas essayé sur une instance de cloud ou quelque chose comme ça

YMMV

Malheureusement, l’option switch pour monter un volume est uniquement disponible dans la commande run .

docker run --help

-v, --volume list Bind mount a volume (default [])

Vous pouvez cependant contourner ce problème afin de ne pas avoir à réinstaller les applications que vous avez déjà configurées sur votre conteneur.

  1. Exportez votre conteneur docker container export -o ./myimage.docker mycontainer
  2. Importer en tant que docker import ./myimage.docker myimage image docker import ./myimage.docker myimage
  3. Ensuite, docker run -i -t -v /somedir --name mycontainer myimage /bin/bash