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

时间:2017-07-05 04:37:36

标签: docker playframework sbt

在对我的播放网络应用程序进行停靠之前,我可以在运行时执行以下操作:

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

我可以在config.env参数中使用以下其中一个dev,qa,prod,我的应用程序将相应地使用相应的application.dev.conf或application.qa.conf运行。

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

我想到的一种方法是使用shell脚本并将其用作入口点。但不确定这可能如何起作用?有什么建议吗?

所以当我做的时候

  

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

2 个答案:

答案 0 :(得分:2)

您可以设置en environment variable when you use docker run(或docker compose

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

这意味着您的Dockerfile可以声明same variable as ENV,并由默认CMD使用。

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

虽然,OP正在使用sbt-native-packagergenerates a Dockerfile Issue 861显示了如何向生成的Dockefile添加命令:

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

这意味着您可以通过这种方式声明ENV。

issue 927显示了如何覆盖默认ENTRYPOINT

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

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

实际上,after discussion,覆盖是不行的,因为生成的DcokerfileENTRYPOINT 跟随<{1}}声明跟随,这是不好。

只有添加 ENVENV,才能生成正确的ENTRYPOINT,如下面的OP sparkr所示。

答案 1 :(得分:1)

所以在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被拾取,加载并且我的播放应用程序针对它运行!