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

Play Framework-通过Docker容器传递应用程序参数,docker,playframework,sbt,Docker,Playframework,Sbt,在停靠play web应用程序之前,我可以在运行时执行以下操作: Joes-Macbook:project-1 joe$ sbt -Dconfig.env=dev run 其中,我可以对config.env参数使用dev、qa、prod中的一个,我的应用程序将使用相应的application.dev.conf或application.qa.conf运行 现在,我将应用程序作为docker容器,这意味着我需要一种注入配置文件的方法。我怎么做呢 我想的一种方法是使用一个shell脚本并将其用作入口

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

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
您可以设置en(或in)

这意味着您的Dockerfile可以声明这一点,并由默认的
CMD
使用

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

不过,OP正在与之合作。
显示如何将命令添加到生成的文件:

dockerCommands ++= Seq (
      // setting the run script executable
      ExecCmd("RUN", "chmod", "u+x", s"${(defaultLinuxInstallLocation in Docker).value}/bin/${executableScriptName.value}")
    )
这意味着您可以通过这种方式声明ENV

并显示如何覆盖默认的
入口点

dockerEntrypoint := Seq("bin/my-app", "-Dconfig.resource=application-prod.conf")
将两者结合起来应该可以实现我上面提出的解决方案


实际上,重写是不好的,因为生成的
Dcokerfile
将具有
ENTRYPOINT
,后跟
ENV
声明,这是不好的


只有同时添加
ENV
ENTRYPOINT
,才能生成正确的
Dockerfile
,如下所示。

因此,在VonC的帮助下,对my 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,然后我的play应用程序将针对它运行

这可能行得通,但我使用sbt原生打包程序,这意味着我无法控制在生成项目时生成docker文件时生成的docker文件@sparkr你可以很容易地根据生成的图像制作自己的图像,不是吗?我想避免这种情况!我刚刚发现有一个dockerEntryPoint可以配置:使用这个dockerEntryPoint,我可以编写一个自定义脚本,然后使用这个参数!是的,我看了一眼,似乎是要走的路!干得好+1.生成入口点(而不是覆盖它)是关键。你的线索确实帮助我解决了这个问题!我编辑了我的答案,指出在这种情况下,覆盖
入口点
不是一个好的选择。
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 run -e "configEnv=test" --rm --name play-8080 -p 8080:9000 joesan/project-1:1.0-SNAPSHOT