web-dev-qa-db-fra.com

Comment ajouter un volume à un conteneur Docker existant?

J'ai créé un conteneur Docker simplement en installant Docker sur Ubuntu et en effectuant:

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

J'ai immédiatement commencé à installer Java et quelques autres outils, à passer du temps dessus et à arrêter le conteneur en

exit

Ensuite, j'ai voulu ajouter un volume et me suis rendu compte que ce n'était pas aussi simple que je le pensais. Si j'utilise Sudo docker -v /somedir run ..., je me retrouve avec un nouveau conteneur, il me faudrait donc installer Java et faire ce que j'ai déjà fait pour arriver à un conteneur avec un volume monté. .

Toute la documentation sur le montage d'un dossier à partir de l'hôte semble impliquer que le montage d'un volume est quelque chose qui peut être fait lors de la création d'un conteneur. Par conséquent, la seule solution pour éviter de reconfigurer un nouveau conteneur à partir de zéro est de le valider dans un référentiel et de l'utiliser comme base pour un nouveau lors du montage du volume.

Est-ce bien le seul moyen d'ajouter un volume à un conteneur existant?

219
mahonya

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 montages.

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 va bien, arrêtez votre ancien conteneur et utilisez ce nouveau.

C'est ça :)

297
Leonardo Cuquejo

Nous n'avons aucun moyen d'ajouter du volume dans un conteneur en cours d'exécution, mais pour atteindre cet objectif, 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/

60
user128364

Jérôme Petazzoni a un article de blog assez intéressant sur la procédure à suivre Attacher un volume à un conteneur pendant son 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 en mode bloc.

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

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

YMMV

12
R0MANARMY

J'ai réussi à monter le dossier /home/<user-name> de mon hôte dans le dossier /mnt du conteneur existant (non en cours d'exécution). Vous pouvez le faire de la manière suivante:

  1. Ouvrez le fichier de configuration correspondant au conteneur arrêté, disponible à l'adresse /var/lib/docker/containers/99d...1fb/config.v2.json (peut être config.json pour les anciennes versions de docker).

  2. Trouver la section MountPoints qui était vide dans mon cas: "MountPoints":{}. Ensuite, remplacez le contenu par quelque chose comme ceci (vous pouvez copier le contenu approprié d'un autre conteneur avec les paramètres appropriés):

    "MountPoints":{"/mnt":{"Source":"/home/<user-name>","Destination":"/mnt","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/home/<user-name>","Target":"/mnt"},"SkipMountpointCreation":false}}

    ou le même (formaté):

  "MountPoints": {
    "/mnt": {
      "Source": "/home/<user-name>",
      "Destination": "/mnt",
      "RW": true,
      "Name": "",
      "Driver": "",
      "Type": "bind",
      "Propagation": "rprivate",
      "Spec": {
        "Type": "bind",
        "Source": "/home/<user-name>",
        "Target": "/mnt"
      },
      "SkipMountpointCreation": false
    }
  }
  1. Redémarrez le service de menu fixe: service docker restart

Cela fonctionne pour moi avec Ubuntu 18.04.1 et Docker 18.09.0

11
Igor Bendrup

Malheureusement, l'option de commutateur permettant de monter un volume ne se trouve que dans la commande run.

docker run --help

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

Vous pouvez toutefois contourner ce problème pour 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 qu'image docker import ./myimage.docker myimage
  3. Alors docker run -i -t -v /somedir --name mycontainer myimage /bin/bash
7
Adel Helal

La meilleure méthode consiste à copier tous les fichiers et dossiers d'un répertoire de votre système de fichiers local en: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

SRC_PATH est sur le conteneur DEST_PATH est sur localhost

Ensuite, faites docker-compose down attacher un volume au même DEST_PATH et exécuter les conteneurs Docker à l’aide de docker-compose up -d.

Ajouter du volume en suivant dans docker-compose.yml

volumes:
 - DEST_PATH:SRC_PATH
0
Vatsal Mishra

Une note pour l’utilisation des conteneurs Windows de Docker après une longue recherche de ce problème!

Condiditions:

  • Windows 10
  • Docker Desktop (dernière version)
  • utilisation de Docker Windows Container pour une image Microsoft/mssql-server-windows-developer

Problème:

  • Je voulais monter un dictionnaire Host dans mon conteneur Windows.

Solution partiellement décrite ici:

  • créer un conteneur docker

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y Microsoft/mssql-server-windows-developer

  • aller à la commande Shell dans le conteneur

docker exec -it <CONTAINERID> cmd.exe

  • créer DIR

mkdir DirForMount

  • arrêter le conteneur

docker container stop <CONTAINERID>

  • commettre un conteneur

docker commit <CONTAINERID> <NEWIMAGENAME>

  • supprimer l'ancien conteneur

docker container rm <CONTAINERID>

  • créer un nouveau conteneur avec un nouveau montage d'image et de volume

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:\DirToMount:C:\DirForMount <NEWIMAGENAME>

Après cela, j'ai résolu ce problème sur les conteneurs Docker Windows.

0
droebi