我有 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/