2014-11-26 15 views
5

Sto cercando di iniziare con Docker per lo sviluppo di un'applicazione Web con Clojure e non sono sicuro su quale direzione andare. Da quello che ho letto finora e anche guardando the offical Docker Clojure repo, ci sono fondamentalmente due modi possibili:Flusso di lavoro di sviluppo per una webapp Clojure con Docker

  • chiamata lein ring server (interattivo o come CMD in un Dockerfile) o
  • utilizzare un Dockerfile per compilare la vostra applicazione in un uberjar e utilizzare java -jar come CMD nel file jar risultante.

Il primo mi sembra essere problematico, nel senso che l'ambiente dev non è il più vicino possibile l'ambiente di produzione, dato che stiamo probabilmente utilizzando un profilo :dev Leiningen aggiungendo roba che non si sarebbe strettamente vuole in produzione (fornendo pochi strumenti e "informazioni", cioè il codice su un server di produzione esposto è sempre una buona idea). Quest'ultimo, tuttavia, sembra avere il problema esattamente opposto: ora ogni modifica richiede fondamentalmente una ricostruzione dell'immagine (si pensi al ciclo di modifica della compilazione), quindi si perderebbe la ricompilazione della funzione lein ring sulla funzionalità di modifica.

In che modo le persone utilizzano questa combinazione in pratica?

PS: Sono consapevole che potrebbero esserci alcune altre modalità operative in pratica (ad esempio utilizzando Immutant o Tomcat come target di distribuzione o utilizzando un server CI come Hudson ecc.). Sto chiedendo la configurazione di base prima qui.

risposta

1

Il mio team e io abbiamo optato per ottimizzare il feedback rapido durante lo sviluppo e ridurre al minimo il numero di parti mobili nei nostri deploys. Di conseguenza, abbiamo deciso di utilizzare lein ring server in fase di sviluppo e optare per spedire un uberjar per la nostra implementazione. Ho fatto questo con il codice in esecuzione in contenitori docker e senza di loro.

Non vorrei tornare a utilizzare un flusso di lavoro di sviluppo che non consentiva di vedere i risultati della modifica del codice il più rapidamente possibile. Nella mia mente, il feedback rapido supera di gran lunga il rischio che i servizi in esecuzione siano leggermente diversi tra la mia macchina locale e la mia produzione.

Inoltre, niente mi impedisce di modificare un paio di righe di codice e quindi di avviare un servizio locale che si avvicina di molto alla mia configurazione di produzione (eseguendo un'immagine docker o costruendo localmente un uberjar).

0

Io uso la seconda opzione java -jar ... per distribuire la mia applicazione Web in produzione (non ancora utilizzando Docker). Questo crea un ciclo di modifica della compilazione come hai detto. Ma non ricompenso per ogni cambiamento. Solo quando sono pronto per il rilascio creo l'uberjar. Di cource CI è sempre raccomandato.

1

Non c'è niente che ti impedisca di girare in modalità produzione con Leiningen. Basta usare:

lein with-profile production ring server 

Ho usato entrambi gli approcci con successo, anche se abbiamo optato per l'approccio uberjar perché dà i tempi di avvio più veloce.

Problemi correlati