在docker中以非root用户身份运行sbt

时间:2018-06-07 12:22:12

标签: docker sbt

尝试创建一个已安装sbt并且可以构建sbt项目的docker镜像,但是在构建时,不会以root用户身份运行(这都是在docker中运行Jenkins的上下文中)。

Dockerfile设置sbt

ENV SBT_VERSION=1.1.6
RUN \
  curl -L -o sbt-$SBT_VERSION.deb http://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \
  dpkg -i sbt-$SBT_VERSION.deb && \
  rm sbt-$SBT_VERSION.deb && \
  apt-get update && \
  apt-get install sbt && \
  sbt sbtVersion

如果我以root用户身份运行sbt,那么一切正常

docker exec -u root myjenkins sbt sbtVersion

产生

[warn] No sbt.version set in project/build.properties, base directory: /
[info] Set current project to root (in build file:/)
[info] 1.1.6

但是当我作为jenkins用户运行sbt时,它会再次尝试下载sbt 1.1.6并最终在尝试修改apt系统文件时失败。

docker exec -u jenkins myjenkins sbt sbtVersion

产生

Getting org.scala-sbt sbt 1.1.6  (this may take some time)...
downloading https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.1.6/sbt-1.1.6.jar ...
    [SUCCESSFUL ] org.scala-sbt#sbt;1.1.6!sbt.jar (68ms)
   .
   .
   .
[warn] No sbt.version set in project/build.properties, base directory: /
[error] java.io.FileNotFoundException: /var/cache/apt/archives/lock (Permission denied)

1 个答案:

答案 0 :(得分:0)

我知道您的Dockerfile中的所有“ RUN”命令都是以root用户身份进行的。

SBT下载Scala:检查其下载位置。默认情况下,SBT下载对~/.ivy2(和/或~/.m2)的依赖关系。如果您更改用户,您的家庭也会更改,因此它将在/home/jenkins/.ivy2中然后在.ivy2上查找依赖项(对此进行仔细检查),该依赖项尚未下载这些依赖项,因此它将尝试下载它们。

关于var/cache/apt/archives/lock,当您需要特权用户才能使用apt时,它将尝试通过apt通过apt通过SBT与您的jenkins用户一起安装。您的应用程序用户无需安装任何内容(或需要root访问权限的任何内容),而应使用所有必需的安装内容来构建映像,然后将其用作单独的用户。另外,如果apt让您头疼,则可以通过下载到文件夹中进行安装,例如:

RUN \
curl -fsL http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz | tar xfz - -C /usr/local && \
ln -s /usr/local/scala-$SCALA_VERSION/bin/* /usr/local/bin/ 

PS:您可能希望始终以jenkins用户身份运行容器,在这种情况下,可以在完成安装后使用USER jenkins并在那里执行任何其他无特权的操作。