使用Docker开发Clojure web应用程序的工作stream程

我正在尝试开始使用Docker开发一个Clojure的Web应用程序,我不确定要走哪条路。 从我目前阅读的内容以及Docker Clojure的官方回购看 ,基本上有两种可能的方式:

  • 调用lein ring server (交互式或作为Dockerfile中的CMD)或
  • 使用Dockerfile将应用程序编译为uberjar,然后在生成的jar文件中使用java -jar作为CMD

前者在我看来是有问题的,因为开发环境与生产环境并没有尽可能的接近,因为我们可能使用了一个:dev人员configuration文件,添加了一个严格意义上不需要的产品(提供因为很less的工具和“信息”,即暴露的生产服务器上的代码总是一个好主意)。 然而,后者似乎有完全相反的问题:现在每一个改变都需要基本上重build图像(想一下编辑 – 编译 – 运行周期),所以你将失去在编辑function上很好的重新编译。

人们在实践中如何使用这种组合?

PS:我知道在实践中可能有一些其他的操作模式(例如,使用Immutant或Tomcat作为部署目标或使用像Hudson等CI服务器)。 我在这里首先询问最基本的设置。

我和我的团队select优化快速反馈,同时开发和减less部署中的移动部件数量。 因此,我们select在开发中使用lein ring server ,并select为我们的部署提供uberjar。 我已经完成了docker容器中运行的代码,没有他们。

我不想回到使用一个开发工作stream程,不能够尽快看到改变代码的结果。 在我看来,快速反馈远远超过我的本地机器和生产之间运行服务的风险。

而且,没有什么能阻止我改变一些代码行,然后启动一个本地服务,这个服务运行得更接近我的生产环境(运行一个内置的docker镜像或者在本地构build一个uberjar)。

没有什么能阻止你在Leiningen的生产模式下运行。 只要使用:

 lein with-profile production ring server 

我已经成功地使用了这两种方法,虽然我们已经解决了uberjar方法,因为它提供了更快的启动时间。

我使用第二个选项java -jar ...将我的web应用程序部署到生产环境(不使用Docker)。 如您所说,这将创build一个编辑 – 编译 – 运行周期。 但是我不会重新编译每一个变化。 只有当我准备释放我创builduberjar。 总是推荐CI的CI。