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
声明,这是不好的。
只需添加 ENV
和ENTRYPOINT
,就可以生成正确的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被拾取,加载和我的游戏应用程序运行!