Play框架 – 通过Docker容器传递应用程序参数

在dockerizing我的play web应用程序之前,我可以在运行时执行以下操作:

Joes-Macbook:project-1 joe$ sbt -Dconfig.env=dev run 

在哪里我可以使用dev,qa,prod到config.env参数的下列之一,我的应用程序将相应地运行相应的application.dev.conf或application.qa.conf。

现在我有我的应用程序作为docker的容器,这意味着我需要一种方式来注入我的configuration文件。 我怎么能这样做?

我想要的一个方法是有一个shell脚本,并将其用作入口点。 但不知道这可能是如何工作的? 有什么build议么?

所以当我这样做

sbt docker:publishLocal

我得到了下面的Dockerfile生成

 FROM anapsix/alpine-java:8_server-jre_unlimited MAINTAINER Joesan <myemail@email.com> WORKDIR /opt/docker ADD opt /opt RUN ["chown", "-R", "daemon:daemon", "."] USER daemon ENTRYPOINT ["sh", "-c", "bin/project-1", "-Denv=$configEnv"] CMD [] ENV configEnv default 

我无法得到在我的Scala应用程序解决$ configEnv。 这是我如何运行生产的docker图像:

 docker run -e "configEnv=crap" --rm --name play-8080 -p 8080:9000 joesan/project-1:1.0-SNAPSHOT 

你可以设置en 环境variables当你使用docker run (或在docker compose

 docker run -e "deep=purple" ... 

这意味着你的Dockerfile可以声明和ENV相同的variables ,并被默认的CMD

 ENV configEnv CMD sbt -Dconfig.env=${configEnv} run 

虽然,OP正在使用sbt-native-packager ,它会生成一个Dockerfile 。
问题861显示如何将命令添加到生成的Dockefile:

 dockerCommands ++= Seq ( // setting the run script executable ExecCmd("RUN", "chmod", "u+x", s"${(defaultLinuxInstallLocation in Docker).value}/bin/${executableScriptName.value}") ) 

这意味着你可以用这种方式来声明ENV。

问题927显示了如何覆盖默认的ENTRYPOINT

 dockerEntrypoint := Seq("bin/my-app", "-Dconfig.resource=application-prod.conf") 

把两者结合起来应该可以实现我上面提出的解决scheme。


实际上, 经过讨论 ,重写是不好的,因为生成的Dcokerfile会有ENTRYPOINT 然后ENV声明,这是不好的。

只需添加 ENVENTRYPOINT ,就可以生成正确的Dockerfile ,如下面的OP sparkr所示。

所以在VonC的帮助下,我的build.sbt没有什么变化,于是我开始工作:

这是我在build.sbt中所拥有的:

 dockerCommands ++= Seq( Cmd("ENV", "configEnv", "default"), // This will be overridden when running! // This is the entrypoint where we can run the application against different environments ExecCmd("ENTRYPOINT", "sh", "-c", "bin/" + s"${executableScriptName.value}" + " -Denv=$configEnv") ) 

所以当我运行我的docker命令时:

 docker run -e "configEnv=test" --rm --name play-8080 -p 8080:9000 joesan/project-1:1.0-SNAPSHOT 

适当的application.test.conf被拾取,加载和我的游戏应用程序运行!