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 quelques autres outils, à y passer du temps et à arrêter le conteneur en
exit
Ensuite, j'ai voulu ajouter un volume et j'ai réalisé que ce n'était pas aussi simple que je le pensais. Si j'utilise sudo docker -v /somedir run ...
alors je me retrouve avec un nouveau conteneur frais, donc j'aurais installé Java et faire ce que j'ai déjà fait auparavant juste 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. Donc, la seule option que j'ai pour é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 lors du montage du volume.
Est-ce en effet la seule façon d'ajouter un volume à un conteneur existant?
docker
balise sont 34k + , ce qui est bien plus que ces deux sites stackoverflow.com/questions/tagged/dockerRéponses:
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 nouvelles montures.
Exemple:
Si tout va bien, arrêtez votre ancien conteneur et utilisez ce nouveau.
C'est tout :)
la source
newnameofcontainer
que cela devrait probablement être nomménew_image_name
- cardocker commit
crée une nouvelle image sur votre système. Ensuite, lorsque vous effectuez une opération,docker run
vous utilisez le nom de l' image à partir de laquelle vous souhaitez exécuter un nouveau conteneur. Ce qui précède fonctionne, mais je voulais simplement clarifier pour d'autres que l'espace réservé newnameofcontainer ci-dessus est en fait le nom d'une nouvelle image. Merci! réponse géniale. oh, vous pouvez voir l'image nouvellement créée à partir de la première commande docker commit à l'aide dedocker image ls
docker run -v /srv/a:/tmp ubuntu:14.04
bon.Nous n'avons aucun moyen d'ajouter du volume dans le conteneur en cours d'exécution, mais pour atteindre cet objectif, vous pouvez utiliser les commandes ci-dessous:
Copiez des fichiers / dossiers entre un conteneur et le système de fichiers local: -
Pour référence, voir:
https://docs.docker.com/engine/reference/commandline/cp/
la source
J'ai réussi à monter le
/home/<user-name>
dossier de mon hôte dans le/mnt
dossier du conteneur existant (pas en cours d'exécution). Vous pouvez le faire de la manière suivante:Ouvrez le fichier de configuration correspondant au conteneur arrêté, qui peut être trouvé à
/var/lib/docker/containers/99d...1fb/config.v2.json
(peut êtreconfig.json
pour les anciennes versions de docker).Trouvez la
MountPoints
section qui était vide dans mon cas:"MountPoints":{}
. Remplacez ensuite le contenu par quelque chose comme ceci (vous pouvez copier le contenu approprié d'un autre conteneur avec les paramètres appropriés):ou le même (formaté):
service docker restart
Cela fonctionne pour moi avec Ubuntu 18.04.1 et Docker 18.09.0
la source
systemctl stop docker.service
2. Éditezconfig.v2.json
:vim <(jq . /var/lib/docker/containers/<container-ID>/config.v2.json)
3. Enregistrez les mises à jour dans un fichier::w config.v2.json
4. Quittez vim::q!
5. Mettez à jour le fichier existant:jq -c . config.v2.json > /var/lib/docker/containers/<container-ID>/config.v2.json
6. Démarrez le moteur docker:systemctl start docker.service
7. Démarrez le conteneur si nécessaire :docker start <container-name/ID>
8. Profitez :-)service docker restart
. J'ai essayé dedocker restart <container>
ne pas reprendre la nouvelle configuration, et elle est écrasée par l'ancienne configuration.jq
Cela aidera également à imprimer le JSON afin qu'il soit modifiable par l'homme:cat config.v2.json | jq . > config.json
Jérôme Petazzoni a un article de blog assez intéressant sur la façon d' attacher un volume à un conteneur pendant son exécution . Ce n'est pas quelque chose qui est intégré à Docker hors de la boîte, mais possible d'accomplir.
Comme il le souligne également
YMMV
la source
Malheureusement, l'option de commutateur pour monter un volume ne se trouve que dans la
run
commande.docker run --help
-v, --volume list Bind mount a volume (default [])
Il existe cependant un moyen de contourner ce problème afin de 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 source
docker container
n'est pas une commande valide sur 1.11.2 (qui est la dernière version prise en charge par Synology à ce jour). Cependant, je ne trouve aucun document indiquant quand il a été ajouté. Dans ce cas, la première commande estdocker export -o ./myimage.docker mycontainer
.Une note pour utiliser les conteneurs Docker Windows après avoir longtemps cherché ce problème!
Conditions:
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 Windows Docker.
la source
La meilleure façon est de copier tous les fichiers et dossiers dans un répertoire de votre système de fichiers local en:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
SRC_PATH
est sur le conteneurDEST_PATH
est sur l'hôte localEnsuite , ne
docker-compose down
fixez un volume à la mêmeDEST_PATH
et exécuter des conteneurs Docker en utilisantdocker-compose up -d
Ajouter du volume en suivant dans
docker-compose.yml
la source