Play Framework-通过Docker容器传递应用程序参数
在停靠play web应用程序之前,我可以在运行时执行以下操作: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脚本并将其用作入口
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