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?
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 :)
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:
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
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:
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).
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
}
}
service docker restart
Cela fonctionne pour moi avec Ubuntu 18.04.1 et Docker 18.09.0
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.
docker container export -o ./myimage.docker mycontainer
docker import ./myimage.docker myimage
docker run -i -t -v /somedir --name mycontainer myimage /bin/bash
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
Une note pour l’utilisation des conteneurs Windows de Docker après une longue recherche de ce problème!
Condiditions:
Problème:
Solution partiellement décrite ici:
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y Microsoft/mssql-server-windows-developer
docker exec -it <CONTAINERID> cmd.exe
mkdir DirForMount
docker container stop <CONTAINERID>
docker commit <CONTAINERID> <NEWIMAGENAME>
docker container rm <CONTAINERID>
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.