我有一个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下载库中的缓存是否也有相同的技巧?
发布于 2019-01-17 15:49:40
首先,您不需要安装scala RPM,因为SBT本身会为您下载Scala (无论您的构建中配置了哪个版本)。
其次,每个RUN命令都会创建一个通常要避免的新层。将它们组合起来:
RUN cmd1 \
&& cmd2 \
&& cmd3为什么要为每个构建构建一个映像?这看起来很浪费。通常,你在Docker镜像之外构建你的东西,并且只打包结果。
我的建议是使用sbt-native-packager SBT插件和它的Docker integration来简单地在构建之后从您的工件构建一个映像。这样,您只需要在映像中使用JRE,而不需要JDK,也不需要SBT。此外,在启动映像时,您不需要等待SBT初始化。
如果您安装了新的Docker版本,则可以使用multi-stage builds。
发布于 2019-01-18 17:43:39
您可以参考travis的解决方案:
.travis.yaml:
# These directories are cached to S3 at the end of the build
cache:
directories:
- $HOME/.ivy2/cache
- $HOME/.sbt/boot/Travis会将上述两个文件夹备份到s3,然后每次用户重建之前,它都会从缓存中获取这两个文件夹。
因此,我们可以知道不再下载jackson library的可能方法是将.ivy2 & .sbt文件夹分开,并将它们放在类似缓存的东西中。
对于您的情况,我认为最好的解决方案是将它们存储在一个基础镜像中,基础镜像的Dockerfile可以简单地与您现在使用的镜像相同(当然,您可以简单地添加在build.sbt中定义的jackson库,目的只是希望.ivy2具有jackson库),然后将其标记为mybaseimage:v1
这样你的新项目的Dockerfile就可以使用base mybaseimage:v1了,因为mybaseimage在.ivy2& .sbt中已经有了这个库,所以你不需要在每次构建项目的Dockerfile时再次下载jackson。
解决方案可能很难看,但我认为可以作为一种变通办法,仅供参考。
https://stackoverflow.com/questions/54229134
复制相似问题