Quelle est la bonne façon de configurer un environnement de développement sur OS X avec Docker?

Intro

Je ne peux pas trouver un bon moyen pour configurer un environnement de développement sur OS X à l'aide de Docker et Boot2Docker. Le problème, je vais frapper est de savoir comment gérer le code source, de sorte que:

  1. Je peux modifier le code sur OS X en utilisant les outils (éditeur de texte, IDE, git, etc) j'ai déjà installé.
  2. Ces modifications sont reflétées dans le conteneur Docker donc, si je ré-exécution de tests ou d'actualiser une page web, je peux voir mes modifications immédiatement.

En théorie, ce devrait être facile à faire par le montage de mon code source en un volume:

docker run -it -v /path/to/my/source/code:/src some-docker-image

Malheureusement, cela a deux problèmes majeurs qui le rendre totalement inutilisable sur OS X:

Question n ° 1: les volumes Montés sur Virtual Box (qui utilisent vboxsf) sont extrêmement lents

Par exemple, ici, c'est combien de temps cela prend Jekyll pour compiler mon page d'accueil si le code source est la 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

Ici est exactement le même menu fixe de l'image, sauf que cette fois, je monte le code source à partir d'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

Question n ° 2: le Fichier de regarder est cassé

La montre par défaut des mécanismes de SBT, Jekyll, et grunt utiliser des technologies telles que inotify, qui ne fonctionnent pas si elles sont en cours d'exécution dans un conteneur Docker et les modifications sont apportées dans OS X à un dossier monté.

Solutions de contournement, j'ai essayé de

J'ai cherché des solutions (y compris tous les sur DONC) et essayé un peu, mais n'ont pas trouvé un succès:

  1. Je commutation de Boot2Docker pour utiliser NFS, mais il était tout aussi lent.
  2. J'ai essayé Vagrant + NFS, et qui est tout aussi lent.
  3. J'ai essayé un Samba de montage, mais le dossier est toujours montré vide dans le conteneur Docker.
  4. J'ai essayé d'utiliser le l'unisson de système de fichiers, qui a travaillé brièvement pour synchroniser les fichiers, mais ensuite maintenu montrant les erreurs de connexion.
  5. J'ai activé les sondages dans Jekyll, mais ce qui accroît sensiblement le délai jusqu'à ce que mes modifications ont été ramassés.
  6. J'ai essayé dériveur, un "plus rapide, plus convivial Docker sur OS X avec Vagrant" et a obtenu certains amélioration. Au lieu de jekyll compilation de 10-15x plus lent, il était de 2-3x plus lent. C'est mieux, mais pas encore tout à fait utilisable.

Quelqu'un a trouvé une solution qui fonctionne réellement et permet de développer de manière productive code avec Docker et OS X?

Mise à jour: une solution à la dernière!

J'ai enfin trouvé une solution qui semble être productif à l'aide de Boot2Docker + rsync. J'ai capturé les détails sur comment configurer cela dans ma propre réponse ainsi qu'un projet open source appelé docker-osx-dev.

  • Vous avez essayé de le officiel Docker programme d'installation pour OS X à droite le long avec NFS? Autant que je sache, ce n'est pas un problème limité à Docker sur OS X, mais aussi Erratique en fonction du développement sur OS X avec la plus grande base de code(s) (nous avons un problème similaire mais avec Vagrant). J'ai trouvé NFS être la seule solution viable et acceptable de la solution.
  • J'ai suivi les instructions officielles pour installer Docker et Boot2Docker. Sont là les instructions officielles pour la configuration de NFS? Je n'ai trouvé dans un GitHub gist, et après leur utilisation, il ne semble pas plus rapide. Comment avez-vous configuration de NFS?
  • Avez-vous vu github.com/boot2docker/boot2docker/issues/64 ?
  • La bonne façon de travailler avec menu fixe est de lancer Linux en natif au lieu de OS X, ou faire tout votre travail de développement à l'intérieur d'une machine virtuelle Linux. Le "boot2docker" l'intégration est un gros vilain hack qui ne fait rien mais semer la confusion et de déception.
  • après la lecture par le biais de tous les 70 commentaires, j'ai trouvé ce script qui est censé changer VirtualBox pour utiliser NFS. Après l'exécution, les performances pour monté des dossiers est toujours aussi mauvais. J'ai mis à jour la question d'origine avec l'exemple de timing.
  • Ce n'est pas utile.
  • La vérité fait mal! Et honnêtement, je ne trouve pas de faire mon travail de développement dans une VM particulièrement problématique. Je trouve ça beaucoup plus simple que de coucher avec OS X/virtualbox intégration.
  • Je crois que NFS ne résoudre les problèmes de performance lorsque vous essayez de partager les ressources du système de fichiers de l'hôte de machine virtuelle. J'ai été en bas de cette route avec Vagrant base de développement. Je n'ai pas l'occasion de tester pleinement le présent et de répondre à la question pour vous en ce moment 🙂 Mon conseil serait de s'y tenir jusqu'à ce que vous résoudre 🙂 "Il devrait être possible!" (tm) 🙂
  • Avez-vous suivi la même procédure que dans ce script pour activer NFS? Ou avez-vous autre chose?
  • J'utilise un boot2docker iso qui inclus guest additions et de nfs. La difficulté est que je ne peux pas trouver une version mise à jour de cette norme ISO plus.
  • FWIW; IHMO la méthode recommandée pour tout type de développement est de développer dans l'isolement (barding tout OS X + menu fixe des problèmes de performances avec l'hôte de partage de ressources de système de fichiers). j'.e: je développe habituellement sur mon hôte, de toute façon (Linux) et d'utiliser Docker (dans n'importe quel environnement) pour les tests, l'intégration et le déploiement(s).
  • J'ai mis en place plusieurs docker dev environnements OS X, nfs est le chemin à parcourir avec vagrant, j'ai abandonné boot2docker il y a longtemps, et assurez-vous que votre temps est synchronisé.
  • Désolé si c'est hors du champ gauche, mais si l'objectif est de développer sur OSX en s'appuyant sur un code externe des pensions, il est sans doute plus "indigènes" d'approche à l'aide de XCode? Peut-être que certains connecteur personnalisé ou des pensions de côté Mercurial/SVN passerelle? Je voulais juste soulever l'idée, étant donné que tous les commentaires/les solutions semblent coller à l'OPs contexte de travailler presque exclusivement avec des non-natifs de composants et d'un ou plusieurs de ces composants peut jouer plus agréable quand accroché avec plus fiables natif/bien-solutions éprouvées pour osx
  • Une autre solution possible serait de coller avec NFS et déplacer la sortie de Jekyll en dehors de NFS. J'ai couru quelques tests sur ma machine comme POC: gist.github.com/m1keil/cf2c489a51e5bdf6ee7c
  • Idée intéressante. Donc NFS performance est principalement limitée par écrit? Ce serait plus logique. Le problème, cependant, est que la seule raison pour utiliser NFS sur rsync est si vous avez la synchronisation bidirectionnelle, mais si vous êtes de mettre la sortie de l'exécution de code sur la machine virtuelle dans un non-SNR dossier, alors vous perdez cet avantage.
  • C'est vrai, mais parfois vous n'avez pas besoin de haute performance bi-directionnel sync (comme dans votre cas). J'ai laissé plus de commentaires détaillés dans votre blog.
  • Je suis l'aide de coreos-vagrant optimisé avec le partage nfs options. Ma configuration: jverdeyen.être/docker/comment-php-symfony-coreos-docker . Je suis également en utilisant dnsdock pour résoudre les noms de domaines. Pour les performances, j'ai aussi créer des données de conteneur avec un tmpfs (ram disk) mont partagée à travers des conteneurs.
  • Tant que github.com/docker/for-mac/issues/77 c'est une question ouverte il n'y a pas beaucoup d'espoir pour une solution de contournement-moins de solution.