如何将凭据传递到sbt build cli?

时间:2018-11-02 19:40:25

标签: scala docker sbt dockerfile

我正在尝试对旧的sbt构建进行Docker化,该构建需要访问私有关系仓库。我以前一直在使用从build.sbt引用的本地凭据文件,但是由于我想从Dockerfile构建中引导所有内容,因此这实际上不适合我当前的使用。我宁可不必将内容输出到文件中,然后将其复制到我的docker build容器中,而只需将其作为docker ARG传递即可。

https://www.scala-sbt.org/1.0/docs/Publishing.html

我读到我可以这样通过:

credentials += Credentials("Some Nexus Repository Manager", 
"my.artifact.repo.net", "admin", "admin123")

所以我想我可以做些类似的事情:

ARG REPO_USER
ARG REPO_PWD
RUN sbt ";credentials += Credentials(\"Some Nexus Repository Manager\", \"repo.host.com\", ${REPO_USER}, ${REPO_PWD}) ;package"

然后运行

docker build . --build-arg REPO_USER=foobar --build-arg REPO_PWD=*****

在我的Dockerfile中,但是没有用。我仍然得到:

无法找到[Sonatype Nexus Repository Manager @ repo.host.com]的凭据

是否有任何 nice 方法将回购凭证从cli传递到sbt?

更新:

我尝试了一种文件方法,但是并不能解决问题,所以我想我可能在错误的地方上了。

RUN echo "realm=Sonatype Nexus Repository Manager" >> .credentials && \
echo "host=repo.host.se" >> .credentials && \
echo "user=$REPO_USER" >> .credentials && \
echo "password=$REPO_PWD" >> .credentials && \
export SBT_CREDENTIALS=.credentials && \
sbt package

更新2

我认为这根本不再是Docker问题,因为我已经在docker容器sbt中对其进行了调试,但是根据sbt文档,我不会以任何方式通过它来证明自己的信誉。

我会回答我自己的问题。

2 个答案:

答案 0 :(得分:0)

sbt文档充其量是误导性的,或者仅仅是错误的。将其调试到docker容器中的位后,我发现我无法通过creds cli以便将它们捡起。 SBT_CREDENTIALS变量也不起作用。

此评论最终救了我:SBT is unable to find credentials when attempting to download from an Artifactory virtual repo

我要进行的最少干扰的方法是在Docker映像的主目录中添加一个sbt配置文件:

RUN mkdir .sbt/0.13/plugins && \
echo "credentials += Credentials(\"Sonatype Nexus Repository Manager\", \"repo.host.se\", \"$REPO_USER\", \"$REPO_PWD\")" >> .sbt/0.13/plugins/creds.sbt
RUN sbt package

答案 1 :(得分:0)

您可以使用环境变量。您可以直接在dockerfile中或通过args在dockerfile中进行设置。像这样:

ARG REPO_USR
ARG REPO_PWD

ENV REPO_USR = ${REPO_USR}
ENV REPO_PWD = ${REPO_PWD}

然后您可以在sbt中使用环境变量:

val repoUser = sys.env.get("REPO_USR").getOrElse("")
val repoPass = sys.env.get("REPO_PWS").getOrElse("")

credentials += Credentials("Repo Realm", "repo.url.com", repoUser, repoPass)

然后,您基本上可以将args传递给docker build,它们将被传递给sbt。