Intro
Je ne peux pas trouver un bon moyen de configurer un environnement de développement sur OS X à l'aide de Docker et Boot2Docker. Le problème que je rencontre est de savoir comment gérer le code source pour que:
- Je peux modifier le code sous OS X en utilisant les outils (éditeur de texte, IDE, git, etc.) que j'ai déjà installés.
- Ces modifications sont reflétées dans le conteneur Docker, donc si je réexécute des tests ou actualise une page Web, je peux voir mes modifications immédiatement.
En théorie, cela devrait être facile à faire en montant mon code source sous forme de volume:
docker run -it -v /path/to/my/source/code:/src some-docker-image
Malheureusement, cela présente deux problèmes majeurs qui le rendent complètement inutilisable sous OS X:
Problème n ° 1: les volumes montés sur VirtualBox (qui utilisent vboxsf) sont extrêmement lents
Par exemple, voici combien de temps il faut à Jekyll pour compiler ma page d'accueil si le code source fait partie de l'image Docker:
> docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash
root@7aaea30d98a1:/src# time bundle exec jekyll build
[...]
real 0m7.879s
user 0m7.360s
sys 0m0.600s
Voici exactement la même image Docker, sauf que cette fois, je monte le code source depuis OS X:
> docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash
root@1521b0b4ce6a:/src# time bundle exec jekyll build
[...]
real 1m14.701s
user 0m9.450s
sys 0m3.410s
Problème n ° 2: la surveillance des fichiers est interrompue
Les mécanismes de surveillance par défaut dans SBT, Jekyll et grunt utilisent des technologies telles que inotify, qui ne fonctionnent pas s'ils s'exécutent dans un conteneur Docker et que les modifications sont apportées dans OS X à un dossier monté.
Solutions de contournement que j'ai essayées
J'ai cherché des solutions (y compris toutes celles sur SO) et en ai essayé quelques-unes, mais je n'ai pas trouvé de solution réussie:
- J'ai changé Boot2Docker pour utiliser NFS , mais c'était tout aussi lent.
- J'ai essayé Vagrant + NFS , et c'était tout aussi lent.
- J'ai essayé un montage Samba , mais le dossier était toujours vide dans le conteneur Docker.
- J'ai essayé d'utiliser le système de fichiers Unison , qui a fonctionné brièvement pour synchroniser les fichiers, mais a continué à montrer des erreurs de connexion .
- J'ai activé l' interrogation dans Jekyll , mais cela a considérablement augmenté le délai jusqu'à ce que mes modifications soient prises en compte.
- J'ai essayé Dinghy , un "Docker plus rapide et plus convivial sur OS X avec Vagrant" et j'ai obtenu quelques améliorations. Au lieu que la compilation Jekyll soit 10 à 15 fois plus lente, elle était 2 à 3 fois plus lente. C'est mieux, mais pas encore tout à fait utilisable.
Quelqu'un a-t-il trouvé une solution qui fonctionne réellement et vous permet de développer du code de manière productive avec Docker et OS X?
Mise à jour: enfin une solution!
J'ai enfin trouvé une solution qui semble productive en utilisant Boot2Docker + rsync. J'ai capturé les détails sur la façon de configurer cela dans ma propre réponse ainsi que dans un projet open source appelé docker-osx-dev .
la source
Réponses:
J'ai décidé d'ajouter ma propre réponse avec la meilleure solution que j'ai trouvée jusqu'à présent. Je mettrai à jour ceci si je trouve de meilleures options.
La meilleure solution à ce jour
La meilleure solution que j'ai trouvée pour mettre en place un environnement de développement productif avec Docker sous OS X est: Boot2Docker + Rsync . Avec rsync, les temps de construction dans un conteneur Docker sont comparables à l'exécution de la compilation directement sur OSX! De plus, le code de l'observateur de fichiers n'a pas besoin d'interrogation (
inotify
fonctionne puisque rsync utilise des dossiers normaux), donc le rechargement à chaud est presque aussi rapide.Il existe deux façons de le configurer: une installation automatisée et une installation manuelle.
Installation automatisée
J'ai regroupé toutes les étapes de configuration de Boot2Docker avec Rsync dans un projet open source appelé docker-osx-dev . Le code est un peu approximatif, mais je l'utilise avec succès depuis plusieurs semaines pour basculer facilement entre 3 projets avec 3 piles technologiques différentes. Essayez-le, signalez les bugs et soumettez des PR! Voir également mon article de blog, Un environnement de développement productif avec Docker sur OS X pour plus d'informations.
Configuration manuelle
brew install boot2docker
.boot2docker init && boot2docker start --vbox-share=disable
.boot2docker shellinit
et copiez les variables d'environnement qu'il imprime dans votre~/.bash_profile
fichier.boot2docker ssh "tce-load -wi rsync"
./foo/bar
dossier à partir de OS X, vous devez créer/foo/bar
sur la Boot2Docker VM:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
.rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
. Consultez la documentation rsync pour connaître les différents paramètres que vous souhaiterez peut-être activer, comme l'utilisation--exclude .git
pour exclure le.git
dossier lors de la synchronisation.brew install fswatch
) redirigé vers rsync.docker run
pour tirer votre conteneur Docker et utiliser le-v
drapeau pour monter le dossier que vous synchronisez:docker run -v /foo/bar:/src some-docker-image
.inotify
), et la construction devrait s'exécuter rapidement car tous les fichiers sont "locaux" pour le conteneur.boot2docker ip
commande pour savoir sur quelle adresse IP il se trouve.la source
VOLUME
, vous pouvez donner à un autre conteneur l'accès à ce volume en utilisant le--volumes-from
drapeau. Je n'ai pas encore essayé cela, mais je pense que cela fonctionnerait.Mise à jour : maintenant que docker pour mac est en version bêta avec des fonctionnalités non-hack, cette voie peut être beaucoup plus raisonnable pour le développement local sans la valeur d'un essai de hacks et de solutions de contournement.
Ne fais pas ça . Je sais que ce n'est pas la réponse que vous espérez probablement, mais prenez une évaluation honnête du coût / avantage d'essayer d'obtenir du code source local + une exécution dockerisée par rapport au développement local sur OSX.
À un moment donné, tous les problèmes, les efforts de configuration et les problèmes opérationnels PEUVENT être assez bien résolus, mais pour le moment, je pense que c'est une perte nette.
Attendez un peu et cela s'améliorera presque certainement.
Je ne suis pas sûr qu'une solution à ce problème se trouve dans un proche avenir. Si ce type de fonctionnalité est la clé de votre flux de travail de développement, je considérerais cela comme un facteur décisif. Cela ne vaut pas un effort de R&D majeur par rapport à l'utilisation de rbenv / bundler pour gérer vos installations jekyll / ruby et à les exécuter localement sur OSX comme les gens le font avec succès depuis plus d'une décennie.
Tout comme "le cloud" n'a aucune implication dans ma configuration de développement local, pour le moment, docker est une victoire pour les tests / la mise en scène / le déploiement et pour l'exécution de bases de données et d'autres composants tiers, mais les applications que je suis en train de coder fonctionnent correctement sur OSX.
la source
Docker pour Mac et Windows sera le moyen définitif de développement avec Docker sur OS X (et Windows). Produit Docker, le logiciel est un «environnement intégré et facile à déployer pour créer, assembler et expédier des applications à partir de Mac ou Windows». Il prétend être en mesure de résoudre les problèmes présentés par le PO. De son annonce du 24 mars 2016 :
la source
Avis de non-responsabilité: je suis peut-être partial, car je suis l'auteur de docker-sync.
J'ai probablement essayé toutes les solutions citées ici, y compris d'autres (voir la version https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), mais elles ont échoué du côté de performances (la plupart d'entre elles) ou sur la machine docker (ou aucune) utilisée / appliquée.
http://docker-sync.io a été conçu pour fusionner toutes les solutions et fournir les meilleures stratégies (en implémentant plusieurs, vous pouvez choisir).
Il peut être utilisé avec rsync (synchronisation 1 voie), y compris les correctifs d'autorisation pour les utilisateurs, et avec l'unisson (synchronisation 2 voies). Cela ne vous oblige pas à entrer dans docker-machine ou dans un hyperviseur spécifique, et ne vous oblige pas à avoir docker pour Mac. Cela fonctionne avec tous.
Les performances EugenMayer / docker-sync / wiki / 4.-Les performances ne sont pas influencées, c'est comme si vous n'aviez aucun partage.
docker-sync et ses observateurs de changement sont optimisés et fonctionnent avec des projets avec des fichiers 12k sans problème.
Essayez-le, si vous le souhaitez, j'aimerais entendre vos commentaires!
la source
Je vous comprends! Je pense que j'ai essayé à peu près tout ce que vous avez essayé et malheureusement c'était encore lent. Puis je suis tombé sur ce commentaire https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 qui suggère d'utiliser Vagrant et Parallels et au lieu de Virtualbox. Cela m'a permis d'utiliser nfs et j'ai en effet vu une grosse amélioration des performances de mon projet (Drupal).
Voici le fichier Vagrant. Tout ce que vous avez à faire est d'installer vagrant, copiez-le dans un fichier appelé Vagrantfile et mettez-le dans un dossier. Allez dans ce dossier et faites simplement un
vagrant up
au lieu de votre boot2docker normal.la source
J'utilise également Vagrant avec des parallèles et boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). Le développement n'a jamais été aussi simple pour moi. Fonctionne très bien avec les
docker-compose
grandes configurations. Je ne ressens pas vraiment de retard ou de consommation massive de ressources.Voici à quoi mon
Vagrantfile
ressemble:la source
Je développe depuis quelques semaines un environnement OS X (Macbook Air mi-2011) + Boot2Docker + Docker-compose. Je n'ai pas rencontré de problèmes de performances majeurs, mais j'évite d'exécuter toute sorte de build lors du développement (pourquoi ne pas utiliser quelque chose comme
jekyll serve --skip-initial-build
?). Voici un exemple dedocker-compose.yml
fichier que j'utilise:docker-compose.yml:
Dockerfile:
J'utilise parfois NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ) mais je n'ai pas remarqué une grande différence de performances en le faisant.
Pour moi, la commodité d'un simple
docker-compose up test
pour faire fonctionner mon environnement a valu le coût en performances (je travaille régulièrement sur plusieurs projets avec des piles différentes).PS:
nodemon
est l'un des rares observateurs de fichiers qui fonctionnent avec vboxsf (voir https://github.com/remy/nodemon/issues/419 ).la source
Docker Unison fonctionne comme un charme! https://github.com/leighmcculloch/docker-unison
Synchronisation bidirectionnelle avec une très bonne performance!
la source
Faire fonctionner docker comme outil de développement est possible. Mais ça va faire mal. J'ai documenté le processus ici:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
la source
Cette méthode est la dernière (septembre 2015) et le moyen le plus simple de configurer Docker sur Mac: lien ici:
Vous installez Docker à l'aide du lien Docker Toolbox vers les instructions ici:
Il s'agit d'un package d'installation Docker complet, qui comprend les outils Docker suivants:
Docker Machine pour exécuter le binaire docker-machine
Docker Engine pour exécuter le binaire docker
Docker Compose pour exécuter le binaire docker-compose
Kitematic, l'interface graphique Docker un shell préconfiguré pour un environnement de ligne de commande Docker
Oracle VM VirtualBox
Que contient la boîte à outils:
la source