J'essaye 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
Lors de l'exécution, docker-compose up -d
tout va bien jusqu'à ce que vous essayiez 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: aucun fichier ou répertoire de ce type
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?
docker
dockerfile
docker-compose
jdcaballerov
la source
la source
Réponses:
Docker-machine monte automatiquement le répertoire des utilisateurs ... Mais parfois, cela ne suffit pas.
Je ne sais pas docker 1.6, mais 1.8 vous PEUX ajouter un montage supplémentaire pour 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
Ainsi, un exemple dans Windows serait
GUI : (ne nécessite PAS l'arrêt de la machine)
<machine name>
(par défaut)<host dir>
(e :)<mount name>
(e)Montage dans boot2docker (partie 2)
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 ce n'est bon que jusqu'au redémarrage de la machine, puis le montage est perdu ...
Ajout d'un montage automatique à boot2docker :
Lors de la connexion à la machine
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1 peut être différent pour vous ...Ajouter
Avec ces changements, vous devriez avoir un nouveau point de montage. C'est l'un des rares fichiers que j'ai pu trouver qui est appelé au démarrage et qui est persistant. Jusqu'à ce qu'il y ait une meilleure solution, cela devrait fonctionner.
Ancienne méthode: moins recommandée , mais laissée comme alternative
/mnt/sda1/var/lib/boot2docker/profile
, sda1 peut être différent pour vous ...Ajouter
En dernier recours , vous pouvez prendre l'alternative un peu plus fastidieuse, et vous pouvez simplement 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 une
try_mount_share <local_dir> <mount_name>
ligne juste avant fi à la fin. Par exempleAssurez-vous simplement de ne pas définir le sur quoi que ce soit dont le système d'exploitation a besoin, comme / bin, etc ...
docker build -t boot2docker .
#Cela prendra environ une heure la première fois :(docker run --rm boot2docker > boot2docker.iso
Ça marche, c'est juste long et compliqué
docker version 1.8.1, version 0.4.0 de docker-machine
la source
/mnt/sda1/var/lib/boot2docker/profile
, pouvez-vous expliquer pourquoi vous êtes passé à l'utilisation/mnt/sda1/var/lib/boot2docker/bootlocal.sh
? De plus, parcourir autant de texte ne contribue pas à la lisibilité de votre réponse ;-)bootlocal.sh
méthode. Tout ce que je peux dire, c'est qu'il semble plus propre d'utiliser simplement une commande de montage comme je l'aibootlocal.sh
fait dans le profil. De plus, généralement, je pense que leprofile
peut être exécuté plusieurs fois et qu'un montage ne doit être exécuté qu'une seule fois, donc cela a plus de sens. Mais les deux peuvent fonctionner.É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 piratage consiste à
obtenir le répertoire de travail actuel de l'instance docker-machine
docker-machine ssh <name> pwd
utiliser un outil de ligne de commande comme
rsync
pour copier un dossier sur un système distantLe pwd par défaut est / root donc la commande ci-dessus serait
rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root
NB: vous devrez fournir le mot de passe du système distant. Vous pouvez rapidement en créer un par ssh dans le système distant et créer un mot de passe.
changer le point de montage du volume dans votre
docker-compose.yml
fichier de.:/app
à/root/<name_of_folder>:/app
courir
docker-compose up -d
NB lorsque des modifications sont effectuées localement, n'oubliez pas de réexécuter
rsync
pour pousser les modifications vers le 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
la source
exit status 255
dois recréer complètement la machine.docker 1.10
etdocker-machine 0.6.0
gist.github.com/cristobal/fcb0987871d7e1f7449ePour le moment, je ne vois pas vraiment de moyen de monter des volumes sur des machines, donc l'approche à présent serait de copier ou de 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 docker. Quelqu'un a fait une pull request implémentant scp sur docker-machine et il est déjà fusionné sur master, il est donc très probable que la prochaine version l'inclura.
Comme il n'est pas encore publié, je recommanderais maintenant que si votre code est hébergé sur github, clonez simplement votre dépôt avant d'exécuter l'application.
Mise à jour: En regardant plus loin, j'ai constaté que la fonctionnalité est déjà disponible dans les derniers binaires , lorsque vous les obtenez, vous pourrez copier votre projet local en exécutant une commande comme celle-ci:
Étant la forme générale:
Ainsi, vous pouvez copier des fichiers depuis, vers et entre des machines.
Bravo! 1
la source
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 risque de se perdre:
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
la source
...:<guest-path> <host-path>
(plutôt que l'inverse). Quelque chose d'aussi simple et critique que cela à noter dans la documentation ... ne l'est tout simplement pas!Si vous choisissez l'option rsync avec docker-machine, vous pouvez la combiner avec la
docker-machine ssh <machinename>
commande 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
vide:rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
( http://linuxcommand.org/man_pages/rsync1.html )
la source
Enfin compris comment mettre à niveau Windows Docker Toolbox vers la v1.12.5 et maintenir mes volumes en état de fonctionnement en ajoutant un dossier partagé dans le
Oracle VM VirtualBox
gestionnaire et en désactivant la conversion de chemin. Si vous avez Windows 10+, il est préférable d'utiliser le plus récent Docker pour Windows.1er la douleur de mise à niveau:
Exemple de base de données Redis:
redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"
Dans Docker Quickstart Terminal ...
docker-machine stop default
- Assurez-vous que la VM est haultéeDans Oracle VM VirtualBox Manager ...
default
VM via ou en ligne de commandeD:\Projects\MyProject\db
=>/var/db
Dans
docker-compose.yml
..."/var/db/redis:/data:rw"
Dans Docker Quickstart Terminal ...
COMPOSE_CONVERT_WINDOWS_PATHS=0
(pour la version Toolbox> = 1.9.0)docker-machine start default
pour redémarrer la machine virtuelle.cd D:\Projects\MyProject\
docker-compose up
devrait fonctionner maintenant.Crée maintenant la base de données redis dans
D:\Projects\MyProject\db\redis\dump.rdb
Pourquoi éviter les chemins d'hôte relatifs?
J'ai évité les chemins d'hôte relatifs pour Windows Toolbox car ils peuvent introduire des caractères «\» non valides. Ce n'est pas aussi agréable que d'utiliser des chemins relatifs à
docker-compose.yml
mais au moins mes collègues développeurs peuvent le faire facilement même si leur dossier de projet est ailleurs sans avoir à pirater ledocker-compose.yml
fichier (mauvais pour SCM).Édition originale
FYI ... Voici l'erreur d'origine que j'ai eue lorsque j'ai utilisé de jolis chemins relatifs propres qui fonctionnaient très bien pour les anciennes versions. Mon mappage de volume était juste
"./db/redis:/data:rw"
ERROR: for redis Cannot create container for service redis: Invalid bind mount spec "D:\\Projects\\MyProject\\db\\redis:/data:rw": Invalid volume specification: 'D:\Projects\MyProject\db\redis:/data
Cela rompt pour deux raisons.
D:
lecteur\
caractèresdocker-compose
les ajoute et vous en blâme !!COMPOSE_CONVERT_WINDOWS_PATHS=0
pour arrêter ce non-sens.Je vous recommande de documenter votre mappage de dossier partagé VM supplémentaire dans votre
docker-compose.yml
fichier car vous devrez peut-être désinstaller à nouveau VirtualBox et réinitialiser le dossier partagé et de toute façon vos collègues développeurs vous adoreront pour cela.la source
Toutes les autres réponses étaient bonnes pour l'époque, mais maintenant (Docker Toolbox v18.09.3) tout fonctionne hors de la boîte. Il vous suffit d'ajouter un dossier partagé dans VirtualBox VM.
Docker Toolbox ajoute automatiquement en
C:\Users
tant que dossier partagé/c/Users
sous la machine virtuelle Linux (en utilisant la fonction de dossiers partagés de Virtual Box), donc si votredocker-compose.yml
fichier se trouve quelque part sous ce chemin et que vous montez les répertoires de la machine hôte uniquement sous ce chemin, tout devrait fonctionner immédiatement.Par exemple:
C:\Users\username\my-project\docker-compose.yml
:Le
.
chemin sera automatiquement converti en chemin absoluC:\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
et ensuitels /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 le chemin de montage de votre hôte n'est pas sous le
C:\Users
chemin. Par exemple, si vous mettez le mêmedocker-compose.yml
sousD:\dev\my-project
.Cela peut être résolu facilement.
docker-machine stop
).Ouvrez l'interface graphique de Virtual Box, ouvrez les paramètres de la machine virtuelle nommée
default
, ouvrez laShared Folders
section et ajoutez le nouveau dossier partagé:D:\dev
d/dev
Appuyez
OK
deux fois 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
devraient maintenant fonctionner dans lesdocker-compose.yml
montages.la source
Il peut être fait combinaison de sorcière de trois outils:
docker-machine mount
,rsync
,inotifywait
Disons que vous avez votre
docker-compose.yml
etrun_web.sh
dans/home/jdcaballerov/web
docker-machine machine:/home/jdcaballerov/web /tmp/some_random_dir
rsync -r /home/jdcaballerov/web /tmp/some_random_dir
Synchronisez à chaque changement de fichiers dans votre répertoire:
ATTENTION - il y a deux répertoires qui ont le même chemin - l'un est sur votre machine locale (hôte), le second sur la machine docker.
la source
Je suppose que le
run_web.sh
fichier est dans le même répertoire que votredocker-compose.yml
fichier. Alors la commande devrait êtrecommand: /app/run_web.sh
.À moins
Dockerfile
que (que vous ne divulguez) ne s'occupe de placer lerun_web.sh
fichier dans l'image Docker.la source
Après avoir résumé les articles ici, un script mis à jour joint, pour créer un point de montage hôte supplémentaire et un montage automatique au redémarrage de Virtualbox. Le bref environnement de travail comme ci-dessous: - Windows 7 - docker-machine.exe version 0.7.0 - VirtualBox 5.0.22
la source
J'utilise docker-machine 0.12.2 avec le lecteur virtualbox sur ma machine locale. J'ai trouvé qu'il existe un répertoire à
/hosthome/$(user name)
partir duquel vous avez accès aux fichiers locaux.la source
Je pensais juste que je mentionnerais que j'utilisais 18.03.1-ce-win65 (17513) sur Windows 10 et j'ai remarqué que si vous avez déjà partagé un lecteur et mis en cache les informations d'identification, une fois que vous avez changé votre mot de passe, le docker commencera à avoir les volumes montés dans des conteneurs comme vierges.
Cela ne donne aucune indication que ce qui se passe réellement, c'est qu'il ne parvient pas à accéder au partage 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 à désactiver puis le partage de lecteur renouvelable et à entrer le nouveau mot de passe.
Il serait utile que docker-compose donne une erreur dans ces situations.
la source