web-dev-qa-db-fra.com

Comment monter des volumes locaux dans une machine de docker

J'essaie d'utiliser Docker-Machine avec Docker-Compose. Le fichier docker-compose.yml a les définitions suivantes:

web:
  build: .
  command: ./run_web.sh
  volumes:
    - .:/app
  ports:
    - "8000:8000"
  links:
    - db:db
    - rabbitmq:rabbit
    - redis:redis

Lorsque vous exécutez docker-compose up -d, tout se passe bien jusqu'à ce que vous tentiez d'exécuter la commande et qu'une erreur se produise:

Impossible de démarrer le conteneur b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d: [8] Erreur système: exec: "./run_web.sh": stat ./run_web.sh: pas de fichier ou de répertoire

Les volumes locaux ne sont pas montés sur la machine distante. Quelle est la stratégie recommandée pour monter les volumes locaux avec le code des webapps?

75
jdcaballerov

Également rencontré ce problème et il semble que les volumes locaux ne sont pas montés lors de l'utilisation de Docker-machine. Une solution de hack consiste à 

  1. récupère le répertoire de travail en cours de l'instance de la machine de menu fixe docker-machine ssh <name> pwd

  2. utilisez un outil de ligne de commande comme rsync pour copier un dossier sur un système distant

    rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:<result _of_pwd_from_1>.
    

Le mot de passe par défaut est/root, donc la commande ci-dessus serait rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root

NB: vous devez fournir le mot de passe pour le système distant. Vous pouvez rapidement créer un fichier SSH dans le système distant et créer un mot de passe.

  1. changez le point de montage du volume dans votre fichier docker-compose.yml de .:/app à /root/<name_of_folder>:/app

  2. exécuter docker-compose up -d

Remarque: lorsque des modifications sont apportées localement, n'oubliez pas de réexécuter rsync pour transmettre les modifications au système distant.

Ce n'est pas parfait mais ça marche. Un problème est en cours https://github.com/docker/machine/issues/179

Les autres projets qui tentent de résoudre ce problème incluent docker-rsync

25
gbozee

Docker-machine monte automatiquement le répertoire des utilisateurs ... Mais parfois, cela ne suffit pas.

Je ne connais pas Docker 1.6, mais en 1.8 vous POUVEZ ajouter un support supplémentaire à Docker-machine

Ajouter un point de montage de machine virtuelle (partie 1)

CLI: (Ne fonctionne que lorsque la machine est arrêtée)

VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <Host_dir> --automount

Donc, un exemple dans Windows serait

/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe sharedfolder add default --name e --hostpath 'e:\' --automount

GUI: (ne nécessite PAS que la machine soit arrêtée)

  1. Démarrer "Oracle VM VirtualBox Manager"
  2. Clic droit <machine name> (par défaut)
  3. Réglages...
  4. Dossiers partagés
  5. Le dossier + l'icône à droite (Ajouter un partage)
  6. Chemin du dossier: <Host dir> (e :)
  7. Nom du dossier: <mount name> (e)
  8. Cochez "Auto-mount" et "Make Permanent" (à lire uniquement si vous le souhaitez ...) (Le montage automatique est en quelque sorte sans objet ...)

Montage dans boot2docker (partie 2)

Monter manuellement dans boot2docker:

  1. Vous pouvez vous connecter de différentes manières. Utilisez "Afficher" dans "Oracle VM VirtualBox Manager" ou ssh/PuTTY dans le menu fixe à l'aide de l'adresse IP docker-machine ip default, etc.
  2. Sudo mkdir -p <local_dir>
  3. Sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>

Mais ceci n’est valable que jusqu’à ce que vous redémarriez la machine, puis le montage est perdu….

Ajout d'un montage automatique à boot2docker

En étant connecté à la machine

  1. Editer/créer (en tant que root) /mnt/sda1/var/lib/boot2docker/bootlocal.sh, sda1 peut être différent pour vous ...
  2. Ajouter

    mkdir -p <local_dir>
    mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
    

Avec ces modifications, vous devriez avoir un nouveau point de montage. C’est l’un des rares fichiers que j’ai pu trouver, appelé au démarrage et persistant. Jusqu'à ce qu'il y ait une meilleure solution, cela devrait fonctionner.


Ancienne méthode: Moins recommandé, mais laissé comme alternative

  • Edit (en tant que root) /mnt/sda1/var/lib/boot2docker/profile, sda1 peut être différent pour vous ...
  • Ajouter

    add_mount() {
      if ! grep -q "try_mount_share $1 $2" /etc/rc.d/automount-shares ; then
        echo "try_mount_share $1 $2" >> /etc/rc.d/automount-shares
      fi
    }
    
    add_mount <local dir> <mount name>
    

En tant que dernier recours, vous pouvez choisir l’alternative légèrement plus fastidieuse et modifier l’image de démarrage.

  • git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
  • cd boot2docker
  • git -c core.autocrlf=false checkout v1.8.1 # ou votre version appropriée
  • Éditer rootfs/etc/rc.d/automount-shares
  • Ajoutez la ligne try_mount_share <local_dir> <mount_name> juste avant le fi à la fin. Par exemple

    try_mount_share /e e
    

    Assurez-vous simplement de ne pas définir les paramètres dont vous avez besoin, comme/bin, etc ...

  • docker build -t boot2docker . # Cela prendra environ une heure la première fois :(
  • docker run --rm boot2docker > boot2docker.iso
  • Sauvegardez l'ancien boot2docker.iso et copiez le nouveau à la place, dans ~/.docker/machine/machines /

Cela fonctionne, c'est juste long et compliqué

docker version 1.8.1, docker-machine version 0.4.0

89
Andy

Pour le moment, je ne vois pas vraiment comment monter des volumes sur des machines. L'approche consiste donc maintenant à copier ou à synchroniser les fichiers dont vous avez besoin dans la machine.

Il y a des conversations sur la façon de résoudre ce problème sur le dépôt Github de la machine à sous. Quelqu'un a fait une requête pull implementation scp sur docker-machine et elle est déjà fusionnée sur le maître; il est donc très probable que la prochaine version l'inclura.

Comme il n'est pas encore publié, je recommanderais maintenant que si vous avez votre code hébergé sur github, il suffit de cloner votre rapport avant de lancer l'application.

web:
  build: .
  command: git clone https://github.com/my/repo.git; ./repo/run_web.sh
  volumes:
    - .:/app
  ports:
    - "8000:8000"
  links:
    - db:db
    - rabbitmq:rabbit
    - redis:redis

Mise à jour: En regardant plus loin, j'ai trouvé que la fonctionnalité est déjà disponible dans les derniers binaires , lorsque vous les aurez obtenus, vous pourrez copier votre projet local en exécutant une commande comme celle-ci:

docker-machine scp -r . dev:/home/docker/project

En tant que forme générale:

docker-machine scp [machine:][path] [machine:][path]

Ainsi, vous pouvez copier des fichiers depuis, vers et entre des machines.

À la vôtre! 1

14
claudevandort

Si vous choisissez l'option rsync avec docker-machine, vous pouvez la combiner avec la commande docker-machine ssh <machinename> comme ceci:

rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<Host_directory_to_sync_to>

Il utilise ce format de commande de rsync, en laissant Host vierge: 

rsync [OPTION]... SRC [SRC]... [USER@]Host:DEST

( http://linuxcommand.org/man_pages/rsync1.html )

4
dmh

Depuis octobre 2017, il existe une nouvelle commande pour docker-machine qui fait l'affaire, mais assurez-vous qu'il n'y a rien dans le répertoire avant de l'exécuter, sinon il pourrait être perdu: 

docker-machine mount <machine-name>:<guest-path> <Host-path> 

Consultez la documentation pour plus d'informations: https://docs.docker.com/machine/reference/mount/

PR avec le changement: https://github.com/docker/machine/pull/4018

2
Jorge

Je pensais juste que je mentionnais que j'utilisais 18.03.1-ce-win65 (17513) sur Windows 10 et que je remarquais que si vous avez déjà partagé un lecteur et mis en cache les informations d'identification, une fois que vous aurez modifié votre docker de mots de passe les volumes montés dans les conteneurs sont vierges.

Cela ne donne aucune indication sur le fait qu'il ne parvient pas à accéder aux informations d'identification partagées avec les anciennes informations d'identification mises en cache ..__ La solution dans ce scénario consiste à réinitialiser les informations d'identification via l'interface utilisateur (Paramètres -> Lecteurs partagés) ou pour désactiver puis partager le lecteur et entrer le nouveau mot de passe.

Il serait utile que docker-compose ait commis une erreur dans ces situations.

0
nrjohnstone

Je suppose que le fichier run_web.sh se trouve dans le même répertoire que votre fichier docker-compose.yml. Ensuite, la commande devrait être command: /app/run_web.sh.

Sauf si la Dockerfile (que vous ne divulguez pas) se charge de mettre le fichier run_web.sh dans l'image Docker.

0
Thomasleveil

Après avoir résumé les publications ici, joint au script mis à jour, pour créer un point de montage hôte et un montage automatique supplémentaires lors du redémarrage de Virtualbox. Le dossier de l'environnement de travail comme ci-dessous: - Windows 7 - docker-machine.exe version 0.7.0 - VirtualBox 5.0.22

    #!env bash

    : ${NAME:=default}
    : ${SHARE:=c/Proj}
    : ${MOUNT:=/c/Proj}
    : ${VBOXMGR:=C:\Program Files\Oracle\VirtualBox\VBoxManage.exe}
    SCRIPT=/mnt/sda1/var/lib/boot2docker/bootlocal.sh

    ## set -x
    docker-machine stop $NAME
    "$VBOXMGR" sharedfolder add $NAME --name c/Proj --hostpath 'c:\' --automount 2>/dev/null || :
    docker-machine start $NAME
    docker-machine env $NAME

    docker-machine ssh $NAME 'echo "mkdir -p $MOUNT" | Sudo tee $SCRIPT'
    docker-machine ssh $NAME 'echo "Sudo mount -t vboxsf -o rw,user $SHARE $MOUNT" |  Sudo tee -a $SCRIPT'
    docker-machine ssh $NAME 'Sudo chmod +x /mnt/sda1/var/lib/boot2docker/bootlocal.sh'
    docker-machine ssh $NAME 'Sudo /mnt/sda1/var/lib/boot2docker/bootlocal.sh'
    #docker-machine ssh $NAME 'ls $MOUNT'
0
Jesse

J'utilise docker-machine 0.12.2 avec le lecteur de virtualbox sur mon ordinateur local. J'ai trouvé qu'il y a un répertoire /hosthome/$(user name) à partir duquel vous avez accès aux fichiers locaux.

0
Benjamin Slabbert

Toutes les autres réponses étaient bonnes pour le moment, mais maintenant (Docker Toolbox v18.09.3), tout fonctionne à la perfection. Vous devez simplement ajouter un dossier partagé dans la machine virtuelle VirtualBox.

Docker Toolbox ajoute automatiquement _C:\Users_ en tant que dossier partagé _/c/Users_ sous une machine Linux virtuelle (à l'aide de la fonction de dossiers partagés Virtual Box). Ainsi, si votre fichier _docker-compose.yml_ se trouve quelque part sous ce chemin et que vous montez la machine répertoires que sous ce chemin - tous devraient fonctionner hors de la boîte.

Par exemple:

_C:\Users\username\my-project\docker-compose.yml_:

_...
  volumes:
    - .:/app
...
_

Le chemin _._ sera automatiquement converti en chemin absolu _C:\Users\username\my-project_, puis en _/c/Users/username/my-project_. Et c’est exactement ainsi que ce chemin est vu du point de vue de la machine virtuelle Linux (vous pouvez le vérifier: _docker-machine ssh_ puis _ls /c/Users/username/my-project_). Ainsi, le montage final sera _/c/Users/username/my-project:/app_.

Tout fonctionne de manière transparente pour vous.

Mais cela ne fonctionne pas si votre chemin de montage de l'hôte n'est pas sous le chemin _C:\Users_. Par exemple, si vous mettez le même _docker-compose.yml_ sous _D:\dev\my-project_.

Cela peut être résolu facilement cependant.

  1. Arrêtez la machine virtuelle (_docker-machine stop_).
  2. Ouvrez l'interface graphique de Virtual Box, ouvrez les Paramètres de la machine virtuelle nommés default, ouvrez la section _Shared Folders_ et ajoutez le nouveau dossier partagé:

    • Chemin du dossier: _D:\dev_
    • Nom du dossier: _d/dev_

    Appuyez deux fois sur OK et fermez l'interface graphique de Virtual Box.

  3. Démarrez la machine virtuelle (_docker-machine start_).

C'est tout. Tous les chemins de la machine hôte sous _D:\dev_ doivent maintenant fonctionner dans les montages _docker-compose.yml_.

0