【问题标题】:How to access environment variables in sbt assembly jar?如何访问 sbt 程序集 jar 中的环境变量?
【发布时间】:2018-03-11 22:47:26
【问题描述】:

我有一个 sbt 项目,可以在指定端口上启动服务器。以下是来自build.sbt的相关摘录:

port in container.Configuration := sys.env.getOrElse("MY_VAR_SEARCH_PORT", 8080).toString.toInt

当我从 sbt 运行项目时,$MY_VAR_SEARCH_PORT 被选中,一切都很好。

但是,对于 prod,我使用 sbt-assembly 并在 docker 容器中运行 jar,因此启动命令如下所示:

docker run -it -p 80:80 -e MY_VAR_SEARCH_PORT=80 mydockerhubrepo/myimageid /docker-entrypoint.sh java -Djava.io.tmpdir=/tmp/jetty -Drun.mode=production -Denv=prod -jar /usr/local/jetty/start.jar

我可以看到 var 被传递给容器,但它没有被 jar 拾取,因为它在默认端口上启动了一个服务器。

什么是让 sbt-assembly jar 访问环境变量的好方法?或者也许我可以将此 var 作为 java 参数传递 - 那么,如何从 build.sbt 文件中访问它?

【问题讨论】:

  • 你找到解决办法了吗?
  • 我发布了一个答案。如果该答案对您有用,请告诉我。或者随意发布你自己的:)

标签: java jar sbt environment-variables sbt-assembly


【解决方案1】:

将 java 启动命令移至可以毫无问题地访问环境变量的 shell 脚本:

  1. 在您的项目中,添加 api_startup.sh:
    #!/bin/sh echo "API startup script running... with ENV=$ENV" java -Djava.io.tmpdir=/tmp/jetty -Drun.mode=production -Denv=$ENV -Drun.port=$MY_VAR_SEARCH_PORT -jar /usr/local/jetty/start.jar
  2. 在您的 Dockerfile 中,添加以下行:
    ADD api_startup.sh /api_startup.sh RUN chown jetty:jetty /api_startup.sh CMD ["/api_startup.sh"]
  3. 现在您可以像这样运行它:
    docker run -it -p 80:80 -e MY_VAR_SEARCH_PORT=80 mydockerhubrepo/myimageid

【讨论】:

  • 太棒了,感谢您的快速回复!我会在接下来的几天里尝试一下,看看它是否适合我!
  • 我实际上最终改变了我打包项目的方式以使用 xerial 包和 docker 文件,这最终为我解决了我的问题。不过,我真的很感谢你花时间为我提出这个问题!如果我以后再使用 sbt 程序集,我一定会试一试!
猜你喜欢
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2018-02-28
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多