Je ne peux pas trouver un bon moyen de configurer un environnement de développement sur OS X en utilisant Docker et Boot2Docker. Le problème que je me pose est comment gérer le code source pour que:
En théorie, cela devrait être facile à faire en montant mon code source en tant que volume:
docker run -it -v /path/to/my/source/code:/src some-docker-image
Malheureusement, cela pose deux problèmes majeurs qui le rendent complètement inutilisable sous OS X:
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-ci, je monte le code source sous 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
Les mécanismes de surveillance par défaut de SBT, Jekyll et Grunt utilisent des technologies telles que inotify, qui ne fonctionnent pas si elles sont exécutées dans un conteneur Docker et si les modifications sont apportées à OS X dans un dossier monté.
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 satisfaisante:
Quelqu'un a-t-il trouvé une solution qui fonctionne réellement et qui vous permet de développer du code de manière productive avec Docker et OS X?
J'ai finalement trouvé une solution qui semble productive avec Boot2Docker + rsync. J'ai capturé les détails sur la manière de configurer ceci dans ma propre réponse ainsi qu'un projet open-source appelé docker-osx-dev .
J'ai décidé d'ajouter ma propre réponse avec la meilleure solution que j'ai trouvée jusqu'à présent. Je le mettrai à jour si je trouve de meilleures options.
La meilleure solution que j'ai trouvée pour configurer un environnement de développement productif avec Docker sous OS X est la suivante: Boot2Docker + Rsync . Avec rsync, les temps de génération dans un conteneur Docker sont équivalents à l'exécution de la génération directement sur OSX! De plus, le code de l'observateur de fichiers ne pas nécessite une interrogation (inotify
fonctionne, car rsync utilise des dossiers normaux). Le rechargement à chaud est donc presque aussi vite.
Il existe deux manières de le configurer: une installation automatisée et une installation manuelle.
J'ai regroupé toutes les étapes de la 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, n environnement de développement productif avec Docker sous OS X pour plus d'informations.
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 d’OS X, vous devez créer /foo/bar
sur la machine virtuelle Boot2Docker: 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
. Recherchez dans la documentation de rsync les divers paramètres que vous pouvez activer, tels que l’utilisation de --exclude .git
pour exclure le .git
dossier lors de la synchronisation.brew install fswatch
) transféré dans rsync.docker run
pour allumer 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" dans le conteneur.boot2docker ip
commande pour savoir sur quelle adresse IP se trouve.Mise à jour : Maintenant que menu fixe pour mac est en version bêta avec une fonctionnalité autre que le piratage, cette route pourrait être beaucoup plus raisonnable pour le développement local sans un essai de hacks et de solutions de contournement.
Ne pas . Je sais que ce n'est pas la solution que vous espérez probablement, mais évaluez honnêtement le rapport coût/bénéfice de la tentative d'obtenir un code source local + une exécution dockerisée par rapport au développement local sous OSX.
À un moment donné, tous les problèmes, les efforts de configuration et les problèmes opérationnels PEUVENT ÊTRE suffisamment bien résolus, mais pour l’instant, j’en déduis que c’est une perte nette.
Problème n ° 1: les volumes montés sur Virtual Box (qui utilisent vboxfs) sont extrêmement lents
Attendez un peu et cela va certainement s'améliorer.
Problème n ° 2: la surveillance des fichiers est interrompue
Je ne suis pas sûr que la solution à ce problème se présente 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 dealbreaker. Cela ne vaut pas la peine de faire un gros effort de R & D par rapport à l’utilisation de rbenv/bundler pour gérer vos installations jekyll/Ruby et à leur exécution locale sur OSX, comme le font les gens depuis une décennie.
Tout comme "le cloud" n'a aucune implication dans la configuration de mon développement local, pour le moment, docker est une solution gagnante pour les tests/le stockage intermédiaire/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 s'exécutent directement. sur OSX.
Docker pour Mac et Windows sera la méthode définitive de développement avec Docker sous OS X (et Windows). Produit Docker, le logiciel est un "environnement intégré, facile à déployer pour la création, l’assemblage et la livraison d’applications depuis Mac ou Windows". Il est censé pouvoir résoudre les problèmes présentés par le PO. Depuis son annonce du 24 mars 2016 :
Disclaimer: 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 quelques autres (voir la compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), mais elles fondamentalement, soit ils ont échoué du côté des performances (la plupart d’entre eux), soit du poste de travail fixe (ou aucun) utilisé/appliqué.
http://docker-sync.io a été construit pour fusionner toutes les solutions et fournir les meilleures stratégies (en en choisissant plusieurs, vous pouvez choisir).
Il peut être utilisé avec rsync (synchronisation à 1 voie), y compris les correctifs d’autorisations pour les utilisateurs, et à l’unisson (synchronisation à 2 voies). Il ne vous force pas à entrer dans Docker-Machine ou dans un hyperviseur spécifique, ni vous oblige à avoir Docker pour Mac. Cela fonctionne avec tous.
La performance EugenMayer/docker-sync/wiki/4.-Performance n'est pas influencée, c'est comme si vous n'aviez aucune action.
docker-sync et ses observateurs de changement sont optimisés et travaillent avec des projets de 12k fichiers sans problème.
Essayez, si vous le souhaitez, j'aimerais connaître vos commentaires!
J'utilise également Vagrant avec parallels et boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). Le développement n'a jamais été aussi facile pour moi. Fonctionne très bien avec docker-compose
et grandes configurations. Je ne ressens pas vraiment de retard ou de consommation massive de ressources.
Voici à quoi ressemble mon Vagrantfile
:
Vagrant.configure(2) do |config|
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.box = "parallels/boot2docker"
config.vm.synced_folder "/Users", "/Users", type: "nfs", mount_options: ["nolock", "vers=3", "udp"], id: "nfs-sync"
end
Je vous comprends! Je pense avoir 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 au lieu de Virtualbox. Cela m’a permis d’utiliser nfs et j’ai en effet constaté une forte amélioration des performances de mon projet (Drupal).
Voici le fichier Vagrant. Tout ce que vous avez à faire est d'installer vagrant, de le copier dans un fichier nommé Vagrantfile et de le placer dans un dossier. Allez dans ce dossier et faites juste un vagrant up
au lieu de votre boot2docker normal.
Vagrant.configure(2) do |config|
config.vm.box = "parallels/boot2docker"
config.vm.network "forwarded_port", guest: 80, Host: 80
config.vm.synced_folder(
"/Users/dicix/work/www", "/vagrant",
type: 'nfs',
nfs_udp: true,
mount_options: %w[actimeo=2],
bsd__nfs_options: %w[alldirs maproot=root:wheel]
)
end
Je développe depuis quelques semaines dans un environnement OS X (Macbook Air mi-2011) + Boot2Docker + Docker. Je n’ai pas rencontré de problèmes majeurs de performances, mais j’évite d’exécuter toute sorte de construction lors du développement (pourquoi ne pas utiliser quelque chose comme jekyll serve --skip-initial-build
?). Voici un exemple de fichier docker-compose.yml
Que j'utilise:
docker-compose.yml:
test:
build: .
volumes:
- ./client:/src/client
- ./server:/src/server
- ./test:/src/test
command: nodemon --exec jasmine-node -- test/ --verbose --autotest --captureExceptions --color
environment:
- DEBUG=*
Dockerfile:
FROM node:0.12
RUN mkdir -p /src
WORKDIR /src
ENV PATH=/src/node_modules/.bin:$PATH
# We add package.json first so that we the
# image build can use the cache as long as the
# contents of package.json hasn't changed.
COPY package.json /src/
RUN npm install --unsafe-perm
COPY . /src
CMD [ "npm", "start" ]
EXPOSE 3000
J'utilise parfois NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ), mais je n'ai pas remarqué de grande différence de performances entre les deux projets.
Pour moi, la commodité d'un simple docker-compose up test
Pour faire fonctionner mon environnement en a valu la peine en termes de performances (je travaille régulièrement sur plusieurs projets avec différentes piles).
PS: nodemon
est l’un des rares observateurs de fichiers fonctionnant avec vboxsf (voir https://github.com/remy/nodemon/issues/419 ).
Docker Unison fonctionne à merveille! https://github.com/leighmcculloch/docker-unison
Synchronisation bidirectionnelle avec une très bonne performance!