scala - 如何在 docker 中加速 sbt scala 构建?

标签 scala docker build sbt libraries

我有 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 容器时,sbt 都会重新下载 jackson 库。我怎样才能加快这个过程,可以在编译前执行部分 sbt 文件。

在我将 RUN sbt sbtVersion 添加到 Dockerfile 之前,sbt 已经完全下载了它自己,并且在我添加了这个命令之后,它已经缓存并且不会在我每次构建 docker 容器时运行。

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

最佳答案

首先,您不需要安装 Scala RPM,因为 SBT 本身会为您下载 Scala(无论您在构建中配置哪个版本)。

其次,每个 RUN 命令都会创建一个您通常希望避免的新层。结合它们:

RUN cmd1 \
  && cmd2 \
  && cmd3

为什么要为每个构建构建一个图像?那似乎很浪费。通常你在 Docker 镜像之外构建你的东西​​并且只打包结果。

我的建议是使用 sbt-native-packager SBT 插件及其 Docker integration在构建它们之后简单地从您的人工制品构建图像。这样,您的镜像中只需要一个 JRE,而不需要 JDK,也不需要 SBT。此外,启动图像时无需等待 SBT 初始化。

你可以使用 multi-stage builds如果您安装了新的 Docker 版本。

关于scala - 如何在 docker 中加速 sbt scala 构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54229134/

相关文章:

java - 我看不到Gradle/Maven的意义

java - 如何在 Java 中实现 Scala apply 方法

scala - 加一链表: Functional Approach

function - 在Scala中自动将类方法转换为采用显式类参数的函数的方法?

docker - 设置 docker ip 和端口会阻止我使用 docker ps -a

android - RadPHP 适合构建应用程序吗?

c - Bazel:使用宏从列表生成构建规则

scala - 没有返回值的情况

docker - 安装时的Docker问题

docker - docker ps显示的端口与nmap不同