如何加快docker中sbt scala的构建速度?

我的docker文件具有:

FROM amazonlinux:2017.03

ENV SCALA_VERSION 2.11.8
ENV SBT_VERSION 0.13.13

# Install Java8 
RUN yum install -y java-1.8.0-openjdk-devel

# Install Scala and SBT
RUN yum install -y https://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.rpm
RUN yum install -y https://dl.bintray.com/sbt/rpm/sbt-0.13.13.rpm
RUN sbt sbtVersion

COPY . /root  
WORKDIR /root  

# Exposing port 80
EXPOSE 80

RUN sbt compile
CMD sbt run

和sbt配置文件一起:

name := "hello"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.5"
libraryDependencies += "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % "2.9.5"

每当我构建docker container sbt时,都要重新下载jackson库.我如何加快此过程,可能在编译之前执行sbt文件的一部分.

在将RUN sbt sbtVersion添加到Dockerfile之前,sbt已完全下载了自身,并且在添加此命令后,每次构建Docker容器时,该命令均已缓存且未运行.

在sbt中的docker下载库中进行缓存可能有相同的技巧吗?

最佳答案
首先,您不需要安装scala RPM,因为SBT本身会为您下载Scala(无论您的构建中配置了哪个版本).

其次,每个RUN命令都会创建一个通常要避免的新层.合并它们:

RUN cmd1 \
  && cmd2 \
  && cmd3

为什么要为每个构建构建映像?这似乎很浪费.通常,您在Docker映像之外构建您的东西,并且只打包结果.

我的建议是使用带有Docker integration的sbt-native-packager SBT插件,在构建伪影后简单地从伪影构建图像.这样,您只需要映像中的JRE,而不是JDK,而不是SBT.另外,启动映像时,您无需等待SBT初始化.

如果您安装了新的Docker版本,则可以使用multi-stage builds.

相关文章

最近一直在开发Apworks框架的案例代码,同时也在一起修复Apw...
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。...
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,...
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...