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?
É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 à
récupère le répertoire de travail en cours de l'instance de la machine de menu fixe docker-machine ssh <name> pwd
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.
changez le point de montage du volume dans votre fichier docker-compose.yml
de .:/app
à /root/<name_of_folder>:/app
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
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
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)
<machine name>
(par défaut)<Host dir>
(e :)<mount name>
(e)Monter manuellement dans boot2docker:
docker-machine ip default
, etc.Sudo mkdir -p <local_dir>
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
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1 peut être différent pour vous ...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
/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éerootfs/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
Cela fonctionne, c'est juste long et compliqué
docker version 1.8.1, docker-machine version 0.4.0
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
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
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
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.
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.
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'
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.
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.
docker-machine stop
_).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é:
D:\dev
_d/dev
_Appuyez deux fois sur OK
et fermez l'interface graphique de Virtual Box.
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
_.