Intro
Non riesco a trovare un buon modo per configurare un ambiente di sviluppo su OS X utilizzando Docker e Boot2Docker. Il problema che sto riscontrando è come gestire il codice sorgente in modo che:
- Posso modificare il codice su OS X utilizzando gli strumenti (editor di testo, IDE, git, ecc.) Che ho già installato.
- Tali modifiche si riflettono nel contenitore Docker, quindi se riesco a eseguire i test o aggiorno una pagina Web, posso vedere immediatamente le mie modifiche.
In teoria, questo dovrebbe essere facile da fare montando il mio codice sorgente come volume:
docker run -it -v /path/to/my/source/code:/src some-docker-image
Sfortunatamente, questo ha due problemi principali che lo rendono completamente inutilizzabile su OS X:
Problema n. 1: i volumi montati su VirtualBox (che utilizzano vboxsf) sono estremamente lenti
Ad esempio, ecco quanto tempo impiega Jekyll per compilare la mia homepage se il codice sorgente fa parte dell'immagine 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
Ecco la stessa identica immagine Docker, tranne che questa volta, monto il codice sorgente da 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
Problema n. 2: la visualizzazione dei file è interrotta
I meccanismi di controllo predefiniti in SBT, Jekyll e grunt utilizzano tecnologie come inotify, che non funzionano se sono in esecuzione in un contenitore Docker e le modifiche vengono apportate in OS X a una cartella montata.
Soluzioni alternative che ho provato
Ho cercato soluzioni (comprese tutte quelle su SO) e ne ho provate alcune, ma non ne ho trovata una di successo:
- Ho cambiato Boot2Docker per utilizzare NFS , ma è stato altrettanto lento.
- Ho provato Vagrant + NFS , e anche questo è stato altrettanto lento.
- Ho provato una montatura Samba , ma la cartella è sempre risultata vuota nel contenitore Docker.
- Ho provato a utilizzare il file system Unison , che ha funzionato brevemente per sincronizzare i file, ma poi ha continuato a mostrare errori di connessione .
- Ho abilitato il polling in Jekyll , ma ciò ha aumentato significativamente il ritardo fino a quando le mie modifiche non sono state raccolte.
- Ho provato Dinghy , un "Docker più veloce e più amichevole su OS X con Vagrant" e ho ottenuto qualche miglioramento. Invece di essere 10-15 volte più lenta, la compilazione Jekyll era 2-3 volte più lenta. È meglio, ma ancora non del tutto utilizzabile.
Qualcuno ha trovato una soluzione che funziona davvero e ti consente di sviluppare codice in modo produttivo con Docker e OS X?
Aggiornamento: finalmente una soluzione!
Finalmente ho trovato una soluzione che sembra produttiva utilizzando Boot2Docker + rsync. Ho catturato i dettagli su come impostarlo nella mia risposta e in un progetto open source chiamato docker-osx-dev .