在对我的播放网络应用程序进行停靠之前,我可以在运行时执行以下操作:
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
答案 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-packager
,generates 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,覆盖是不行的,因为生成的Dcokerfile
将ENTRYPOINT
跟随<{1}}声明跟随,这是不好。
只有添加 ENV
和ENV
,才能生成正确的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被拾取,加载并且我的播放应用程序针对它运行!